前回
8. サブクエリ
- サブクエリは「使い捨てのビュー(文)」に相当する。ビューとは異なり、文の実行終了後に消去される。
- サブクエリには名前を付ける必要がある。処理内容から考えて適切な名前を付ける。
- スカラ・サブクエリとは「必ず1行1列だけの結果を返す」との制限を付けたサブクエリを指す。
8.1 サブクエリとビュー
ビューが文を保存することで利便性を高めるものだったのに対してサブクエリとは、ビュー定義の文をそのまま句に持ち込んだものと言える。
SELECT (XXX) FROM (ビュー) AS (YYY) -- たとえば SELECT (XXX) FROM ( SELECT ZZZ FROM WWW WHERE VVV) AS (YYY) WHERE ...
という形式を取る*1。この場合、の直後の()でくくられた文が最初に実行され、その後に外側の文が実行される。サブクエリは何重にすることも可能ではあるものの、読みにくくなる上、パフォーマンスにも悪影響を与えるため、過度に深くすることは避けた方が良い。
8.2 サブクエリの名前
サブクエリの名前は原則的に必要である。
8.3 スカラ・サブクエリ
サブクエリは出力される行数に制約はなく、大抵の結果は複数行に渡る。これに対してスカラ・サブクエリは必ず1行1列だけの戻り値を返すような制約を掛けたサブクエリである。1行1列であるため、各種演算子の入力として用いることができる。
たとえば、ある列がその列の全値の平均よりも大きいような行を検索するとしたい場合、句内に集約関数を用いることはのルール上不可能である。そこで句内の比較値に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 スカラ・サブクエリを書ける場所
スカラ・サブクエリは定数・列名を書くことが可能なすべての場所に書くことができるため、句に句、句や句などほぼすべての場所に用いることができる。
8.3.2 スカラ・サブクエリの注意点
スカラ・サブクエリは必ず1行1列を返すような文にしなければならない。