8-9 SQL(3)副問合せ

副問合せの基礎

 ある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を用いた副問合せでは、相関副問合せが行われることがほとんどです。