トップDML選択(副問合せ) ≫ 副問合せ(サブクエリ)を行う

副問合せ(サブクエリ)を行う

SQLではSELECT文による問合せを入れ子にすることができます.入れ子の内側の問合せを副問合せ,外側の問合せを主問合せといいます.副問合せを用いたSQLでは,まず内側の副問合せが値を返し,それを外側の主問合せのWHERE句が受けて最終的な結果となります.
副問合せは単一行副問合せと複数行副問合せに分類することができます.

単一行副問合せ

単一行副問合せとは1レコードだけを外側の問合せに返す副問合せをいいます.基本的な単一行副問合せの書き方は以下とおりです.

SELECT 列名1, 列名2, ...
FROM テーブル名
WHERE 列名 = ( 
SELECT 列名 FROM テーブル名 [WHERE 条件式など]
)

ピンク色で示した部分が副問合せです.実行の際にはまず副問合せが解決され,値が抽出されます.次に主問合せが解決され,副問合せから返された値と等しい値を持つレコードが選択されます.上記では副問合せと主問合せを「=」で結んでいますが,そのほかにも以下の演算子が使用できます.

比較演算子説明
=等しい
<小さい
>大きい
<=以下
>=以上
<>, !=等しくない

上記の書き方では副問合せが複数のレコードを返す場合はエラーとなるので注意が必要です.複数のレコードを扱いたい場合は以下で紹介する複数行副問合せを使用します.
サンプルに移動

複数行副問合せ

単一行副問合せとは複数レコードを主問合せに返す副問合せをいいます.基本的な複数行副問合せの書き方は以下とおりです.

SELECT 列名1, 列名2, ...
FROM テーブル名
WHERE 列名 演算子 (
    SELECT 列名
    FROM テーブル名
    [WHERE 条件式など]
)

演算子には以下が使用可能です.

演算子説明
IN副問合せが返した値のいずれかと等しいかを評価する
EXISTS副問合せが返した値が存在するかを評価する
ANY,SOME副問合せが返した値のいずれかの値を評価する
ALL副問合せが返した値の全てを評価する

ここでは上記に示した演算子をそれぞれ詳しく説明しません.詳細は上記のリンクからご覧下さい.

SQL サンプル

例として以下の社員マスタを使用して副問合せを行います.

社員

社員コード社員名給与
00001チャーリー・ブラウン220000
00002ルシール・ヴァン・ぺルト205000
00003ライナス・ヴァン・ぺルト190000
00004シュローダー200000
00005ペパーミント・パティ300000
00006マーシー230000

平均以上の給与を持つ社員を取得します.

SQL

SELECT 社員名, 給与
FROM 社員
WHERE 給与 >= (
    SELECT AVG(給与)
    FROM 社員
)

結果

社員名給与
ペパーミント・パティ300000
マーシー230000