副問い合わせの使い方

問い合わせの中に問い合わせ

書き方

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 は、登録不要・無料で遊べます(それより先はブロンズ以上のプランで遊べます)。

SQL 構文一覧(使い方と例)へ戻る