副問合せの基礎
あるSELECT文の中に、カッコで囲まれた別のSELECT文を埋め込んで(SELECTを入れ子にして)使うことができます。このとき外側のSELECT文を「主問合せ」、カッコ内側のSELECT文を「副問合せ(サブクエリ)」と呼びます。
副問合わせは主問合わせの前に実行され、その結果は主にWHERE句の条件に用いられます。
例 SELECT 氏名
FROM 社員
WHERE 部署コード IN (SELECT 部署コード
②WHERE 部署コード IN (‘システム部’) FROM 社員
と同じこと GROUP BY 部署コード
HAVING COUNT(*) >= 2)
①(副問合せ)社員が2人以上いる部署を抽出
→ 例えば、システム部
条件式 | 真になる条件 |
---|---|
列名 IN (副問合せ) | 列の値が問合せ結果のいずれかに一致する |
列名 NOT IN (副問合せ) | 列の値が問合せ結果のいずにも一致しない |
列名 EXISTS (副問合せ) | 副問い合わせの結果が1行でも存在する |
列名 NOT EXISTS (副問合せ) | 副問い合わせの結果が1行も存在しない |
EXISTSを用いた副問合せ
例 SELECT 氏名
FROM 社員
WHERE EXISTS(SELECT *
副問合せの結果があれば真 FROM 社員
WHERE 部署.部署長社員名 = 社員.社員番号)
各社員番号について「その社員番号が、部署長社員番号の中に存在するか」
このSQL文では、社員表の行ごとに副問い合わせを実行します。つまり、社員番号ごとに
「その社員番号が、部署表の部署長社員番号中に存在するか」
を調べます。
その行が1行でも存在すれば、その社員表の行(社員番号)について、EXISTS述語は真を返す(抽出対象とする)ことになります。
なお、この服問い合わせでは、主問い合わせのFROM句に記述された、社員表の社員番号が、副問合せ(FROM句では、部署表のみを指定)のWHERE句で参照されています。このように、主問合わせの列が副問合わせ内で参照されるものを「相関副問合せ」と呼びます。EXISTSを用いた副問合せでは、相関副問合せが行われることがほとんどです。