副問合せとは
SQLにおいて「副問合わせ」とは、メインのSQLに別の問合わせを入れ子で挿入すること。
SELECT 列名
FROM テーブル名
WHERE 列名 比較演算子 (
SELECT 列名
FROM テーブル名
)
()で囲まれた文を副問合わせという。
逆に囲まれていない文は主問合わせという。
副問合わせ内では通常のSQL文と同様にWHERE句やGROUP BY句など使える。
また、主問合わせのWHERE句やFROM句に使用できる。
ただ、主問合せのGROUP BY句には使用できない。
副問合せの注意点
-
副問合せの実行結果が0件の場合でも主問合せはエラーにならない。
⇨ただし、主問合せの結果も0件になる。 -
単一行副問合せでは、単一行演算子が使える。
⇨単一行副問合わせとは実行結果が1件となる副問合せ
⇨単一行演算子とは「=」、「<」、「>」など -
複数行問合わせでは、複数行演算子が使える。
⇨複数行問合わせとは実行結果が複数件の副問合せ
⇨複数行演算子とは「IN」、「=ANY」、「>ALL」など
⇨複数行問合せでは複数行演算子は使えない。
複数行演算子について
ANY
単一行演算子と組み合わせる必要がある。
SELECT 列名
FROM テーブル名
WHERE 列名 =ANY (
SELECT 列名
FROM テーブル名
)
上記の場合、副問合せの実行結果のいずれかに該当する値を主問合せのWHERE句で比較対象としている。
つまり、「IN」と同じように使用できる。
ただし、「NOT IN」と「<>ALL」にはで注意(後述)。
ALL
同じく、単一行演算子と組み合わせる必要がある。
SELECT 列名
FROM テーブル名
WHERE 列名 <ALL (
SELECT 列名
FROM テーブル名
)
上記の場合、副問合せの実行結果の全ての値よりも小さい値を主問合せのWHERE句で比較対象としている。
「NOT IN」と「<>ALL」は同じもので、副問合せの実行結果の全ての値と等しくないとTRUEを返す。
ただ、実行結果にNULLが含まれる場合は常にFALSEを返す。
そのため、NULLを除外して比較するには副問合せのWHERE句等で「IS NOT NULL」を指定する必要がある。