はじめに
サブクエリとは簡単にいうとSQL文の中にSQL文を書くことです。
サブクエリは複雑な問い合わせをしたい時に役立ちます。
サブクエリの使い方には大まかに以下三つが挙げられます。
- スカラー・サブクエリ
- 複数行サブクエリ
- 相関サブクエリ
シリーズものとして、本記事ではスカラー・サブクエリについて記述します。
「はじめに」は同シリーズすべて同じ内容です。一読された方は読み飛ばしてください。
備考
この記事ではMySQLを使った書き方をします。
サブクエリの使い道
サブクエリの用途は色々ありますが、主な用途は「柔軟なSQLクエリを作成するため」です。
サブクエリの中にサブクエリを書くこともできネストを作成できます。また、記述できる場所はSELECT句でもGROUP BY句でもHAVING句でもどこでも書くことができ、非常に柔軟性に富んでいます。
しかし、あまりにもネストが深くなると、パフォーマンスに影響が出る他、読みづらいスパゲッティクエリとなってしまうため、注意が必要です。
スカラー・サブクエリ
スカラサブクエリは必ず1行1列だけの戻り値を返すという制約をつけたサブクエリのことです。「スカラ」は「単一の」という意味です。
例えば、会社の上司から「全従業員の平均給与よりも高い給与を支払っている従業員の詳細を取得して」と命じられた時、
以下のようなクエリになります。
SELECT *
FROM employee
WHERE salary > (SELECT AVG(salary) FROM employee)
このように、比較演算子(>, <, =)を使いたい時に、スカラー・サブクエリを使うのが有効です。
まとめ
サブクエリのスカラー・サブクエリについて解説しました。
おまけ
スカラーサブクエリ、複数行サブクエリ、相関サブクエリに関する詳細をまとめます。
種類 | 説明 | 主に使う構文 | 使用例 |
---|---|---|---|
スカラー・サブクエリ | 単一の値(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.列); |
参考