副問合せ

SELECT、INSERT、DELETE等のSQLを使用する際にWHERE句の条件として別のSELECT文を指定すること。
副問合せとして使用するSELECT文により解釈する順番が異なるので注意すること。
先頭で記述されるSELECT等を副問合せに対して主問合せと言う。

副問合せ

副問合せが主問合せで使用しているテーブルの属性を使用していない場合がこれにあたる。
解釈する順番としては副問合せ→主問合せの順となる。

SELECT 受注番号 FROM 受注テーブル WHERE 得意先コード IN (SELECT 得意先コード FROM 得意先テーブル WHERE 担当者 = '田中')
※得意先テーブルから担当者が「田中」の得意先コードを取得し、それをキーに受注テーブルから受注番号を取得する。

副問合せの結果が複数行となる場合は条件としてINの他に以下のようなものがある。

IN 副問合せと一致
ALL 副問合せの全ての結果と比較して大きい(あるいは小さい)
SOME 副問合せのいずれかの値よりも大きい(あるいは小さい)
ANY SOMEと同じ。副問合せのいずれかの値よりも大きい(あるいは小さい)

また、副問合せの結果が単一行となるような場合は条件として指定できるのは比較演算子のみとなる。
SELECTのWHERE句のほかにもFROM句やHAVING句、UPDATE句などでも使用できる。

相関副問合せ

副問合せの一種だが、解釈順番が主問合せ→副問合せの順となる。
相関副問合せの条件は主問合せのFROM句で使用しているテーブルを副問合せで使用すること。
主問合せの結果が存在しないと副問合せが実行されないため、条件としてはINやEXISTSが使用される。
(INとEXISTSは同じ結果を得る事が可能だが、一般的にはEXISTSのほうが処理が早いとされている。)

SELECT 受注番号 FROM 受注テーブル X WHERE EXISTS (SELECT 得意先コード FROM 得意先テーブル WHERE 得意先コード = X.得意先コード AND 担当者 = '田中')
※受注テーブルからレコードを取得し、レコードの得意先コードと得意先テーブルの得意先コードが一致、
かつ担当者が「田中」のレコードが存在する場合に受注番号を取得する。