「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。

MENU

データベースとSQL(11/20)

はじめに

 データ分析を行う場合、データの管理運用、蓄積も重要な論点となる。そのためにはSQLやデータベースの知識が求められる。そこでまずは

を基にSQLの勉強をしていく。

8. サブクエリ

  • サブクエリは「使い捨てのビュー(\mathrm{SELECT}文)」に相当する。ビューとは異なり、\mathrm{SELECT}文の実行終了後に消去される。
  • サブクエリには名前を付ける必要がある。処理内容から考えて適切な名前を付ける。
  • スカラ・サブクエリとは「必ず1行1列だけの結果を返す」との制限を付けたサブクエリを指す。

8.1 サブクエリとビュー

 ビューが\mathrm{SELECT}文を保存することで利便性を高めるものだったのに対してサブクエリとは、ビュー定義の\mathrm{SELECT}文をそのまま\mathrm{FROM}句に持ち込んだものと言える。

SELECT (XXX)
FROM (ビュー) AS (YYY)

-- たとえば
SELECT (XXX)
FROM (
    SELECT ZZZ
    FROM WWW
    WHERE VVV) AS (YYY)
WHERE ...

という形式を取る*1。この場合、FROMの直後の()でくくられた\mathrm{SELECT}文が最初に実行され、その後に外側の\mathrm{SELECT}文が実行される。サブクエリは何重にすることも可能ではあるものの、読みにくくなる上、パフォーマンスにも悪影響を与えるため、過度に深くすることは避けた方が良い。

8.2 サブクエリの名前

 サブクエリの名前は原則的に必要である。

8.3 スカラ・サブクエリ

 サブクエリは出力される行数に制約はなく、大抵の結果は複数行に渡る。これに対してスカラ・サブクエリは必ず1行1列だけの戻り値を返すような制約を掛けたサブクエリである。1行1列であるため、各種演算子の入力として用いることができる。
 たとえば、ある列がその列の全値の平均よりも大きいような行を検索するとしたい場合、\mathrm{WHERE}句内に集約関数を用いることは\mathrm{SQL}のルール上不可能である。そこで\mathrm{WHERE}句内の比較値に1行1列のみ返すサブクエリを入れると実行可能になる。

-- 以下はエラーを起こす
SELECT Y1, Y2, Y3
FROM TABLE1
WHERE Y1 > AVG(Y1)

-- 代わりに以下を用いる
SELECT Y1, Y2, Y3
FROM TABLE1
WHERE Y1 > (SELECT AVG(Y1)
                       FROM TABLE1)
8.3.1 スカラ・サブクエリを書ける場所

 スカラ・サブクエリは定数・列名を書くことが可能なすべての場所に書くことができるため、\mathrm{WHERE}句に\mathrm{SELECT}句、\mathrm{GROUP\ BY}句や\mathrm{HAVING}句などほぼすべての場所に用いることができる。

8.3.2 スカラ・サブクエリの注意点

 スカラ・サブクエリは必ず1行1列を返すような\mathrm{SELECT}文にしなければならない。

*1:ただしOracleの場合、最後のAS (YYY)はエラーを起こす。ASを取り除くこと。

プライバシーポリシー お問い合わせ