はじめに
サブクエリとは簡単にいうとSQL文の中にSQL文を書くことです。
サブクエリは複雑な問い合わせをしたい時に役立ちます。
サブクエリの使い方には大まかに以下三つが挙げられます。
- スカラー・サブクエリ
- 複数行サブクエリ
- 相関サブクエリ
シリーズものとして、本記事では相関サブクエリについて記述します。
「はじめに」は同シリーズすべて同じ内容です。一読された方は読み飛ばしてください。
備考
この記事ではMySQLを使った書き方をします。
サブクエリの使い道
サブクエリの用途は色々ありますが、主な用途は「柔軟なSQLクエリを作成するため」です。
サブクエリの中にサブクエリを書くこともできネストを作成できます。また、記述できる場所はSELECT句でもGROUP BY句でもHAVING句でもどこでも書くことができ、非常に柔軟性に富んでいます。
しかし、あまりにもネストが深くなると、パフォーマンスに影響が出る他、読みづらいスパゲッティクエリとなってしまうため、注意が必要です。
相関サブクエリ
相関サブクエリは、外側のSQLと内側のSQL(サブクエリ)が「相関」して動くサブクエリです。以下に具体的な例を示します。
「従業員」と「部署」のテーブルを考えます。
各部署で最高給与を得ている従業員のリストを取得したい場合、次のようなクエリになります。
SELECT 従業員名, 給与, 部署ID
FROM 従業員 AS E1
WHERE 給与 = (
SELECT MAX(給与)
FROM 従業員 AS E2
WHERE E1.部署ID = E2.部署ID -- ここが重要
);
内側のサブクエリ(E2)は、外側のクエリ(E1)の部署IDと一致するレコードを参照しています。このWHERE句は内部サブクエリの部署IDの集合に対する条件です。
相関サブクエリはテーブル全体ではなく、テーブルの一部のレコード集合に限定した比較をしたい場合に使います。
まとめ
サブクエリの相関サブクエリについて解説しました。
おまけ
スカラーサブクエリ、複数行サブクエリ、相関サブクエリに関する詳細をまとめます。
種類 | 説明 | 主に使う構文 | 使用例 |
---|---|---|---|
スカラー・サブクエリ | 単一の値(1行1列)を返します。SELECT文の中で単一の値を返す必要がある場所で使われます。 | AVG , 演算子(>,<,=) | SELECT * FROM テーブル WHERE 列 = (SELECT AVG(列) FROM テーブル WHERE 条件); |
複数行サブクエリ | 一つ以上の行を返すことができます。 | IN,ANY,ALL,演算子(>,<,=) | SELECT * FROM テーブル WHERE 列 IN (SELECT 列 FROM テーブル WHERE 条件); |
相関サブクエリ | 外側のクエリと「相関」している内側のクエリです。外側のクエリの各行に対して内側のクエリが実行され、外側の列を参照できます。 | IN, EXISTS ,演算子(>,<,=) | SELECT * FROM テーブルA WHERE EXISTS (SELECT * FROM テーブルB WHERE テーブルB.列 = テーブルA.列); |
参考