副問い合わせの使い方
問い合わせの中に問い合わせ
書き方
WHERE 列 > (SELECT …) WHERE 列 IN (SELECT …) FROM (SELECT …) 別名
かっこの中の SELECT の結果を使います。1 つの値・値の並び・表として使えます。
よく使うオプション
| オプション | 意味 |
|---|---|
WHERE 列 > (SELECT …) | 1 つの値を返す副問い合わせと比べる |
WHERE 列 IN (SELECT …) | 値の並びを返す副問い合わせを候補にする |
FROM (SELECT …) 別名 | 副問い合わせの結果を表として使う |
SELECT (SELECT …) | 列の値として副問い合わせを書く |
例
SELECT name, salary FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);
給与が全員の平均より高い社員を出します。かっこの中を先に計算して、その値と比べます。
SELECT name FROM departments WHERE id IN (SELECT dept_id FROM employees WHERE hired_on >= '2024-04-01');
今年の 4 月以降に人が入った部署を出します。
SELECT t.dept_id, t.cnt FROM (SELECT dept_id, COUNT(*) AS cnt FROM employees GROUP BY dept_id) t WHERE t.cnt >= 5;
部署ごとに数えた結果を表 t として使い、5 人以上の部署を出します。FROM の副問い合わせには別名が要ります。
SELECT name, (SELECT COUNT(*) FROM orders o WHERE o.customer_id = c.id) AS orders FROM customers c;
客ごとに、注文の数を列として出します。外側の c.id を中で使っています(相関副問い合わせ)。
よくある間違い・注意
- = や > で比べる副問い合わせが 2 行以上を返すと、エラーになります。何行返るか分からないときは IN を使います。
- 副問い合わせが 0 行のときの値は NULL になり、比べた結果はどの行にも合いません。
実際に打って練習する
SQL コースの Lv32「問い合わせの中の問い合わせ」で覚えます。ブラウザの中のシミュレーターで、本物と同じように打って確かめられます。
Lv1〜3 は、登録不要・無料で遊べます(それより先はブロンズ以上のプランで遊べます)。