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 | 副問合せが返した値の全てを評価する |
ここでは上記に示した演算子をそれぞれ詳しく説明しません.詳細は上記のリンクからご覧下さい.
例として以下の社員マスタを使用して副問合せを行います.
社員
| 社員コード | 社員名 | 給与 |
|---|---|---|
| 00001 | チャーリー・ブラウン | 220000 |
| 00002 | ルシール・ヴァン・ぺルト | 205000 |
| 00003 | ライナス・ヴァン・ぺルト | 190000 |
| 00004 | シュローダー | 200000 |
| 00005 | ペパーミント・パティ | 300000 |
| 00006 | マーシー | 230000 |
平均以上の給与を持つ社員を取得します.
SQL
SELECT 社員名, 給与
FROM 社員
WHERE 給与 >= (
SELECT AVG(給与)
FROM 社員
)
結果
| 社員名 | 給与 |
|---|---|
| ペパーミント・パティ | 300000 |
| マーシー | 230000 |