SQLサブクエリとは?〜実行順ごとに解説〜

目次

はじめに

SQLにおけるサブクエリとは、別のSQL文の内部に埋め込まれたSELECT文のことです。外側のクエリが内側のクエリの結果を利用して複雑な処理を行います。

使用データ

Employeesテーブル

Departmentsテーブル

Ordersテーブル

Where句における使用

最も一般的な使い方でWhere句で使う場合は条件にサブクエリを使ってフィルタリングします。

例えば平均給与より高い社員を取得する場合

クエリ

SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

サブクエリのSELECT AVG(salary) FROM employeesが実行されメインクエリが実行されます

サブクエリの実行結果

AVG
522000.0000

クエリの実行結果

namesalary
佐藤健一610000
高橋翔530000
伊藤直樹700000
小林由美550000

相関サブクエリ

先ほどのクエリはすべての行で同じサブクエリで使っていたが、相関副問い合わせはメインクエリの値を参照することを可能にする。外側の行が1行処理されるたびに、その行の値を使って副問合せが実行されます。つまり「行ごとに問い合わせ内容が変わる」のが特徴です。

「自分と同じ部署の平均給与」より高い社員を取得する場合

クエリ

SELECT e.name, e.dept_id, e.salary
FROM employees e
WHERE e.salary > (
  SELECT AVG(e2.salary) FROM employees e2 WHERE e2.dept_id = e.dept_id);

WHERE e2.dept_id = e.dept_idで外側の行を参照し行ごとに異なるクエリになります。サブクエリで自分と同じ部署の平均給与が導出されます。

dept_id = 1の時のサブクエリの実行結果

AVG(salary)
595000.0000

クエリの実行結果

namedept_idsalary
佐藤健一1610000
山田美咲3450000
高橋翔2530000
伊藤直樹1700000
加藤誠3470000

FROM句での使用

副問合せの結果を仮想的なテーブルとして扱います。

受注件数と受注合計額を社員情報と並べて表示

クエリ

SELECT e.name, t.order_count, t.total_amount
FROM employees e
JOIN (
  SELECT emp_id,
         COUNT(*) AS order_count,
         SUM(amount) AS total_amount
  FROM orders
  GROUP BY emp_id
) AS t ON e.emp_id = t.emp_id;

サブクエリ

クエリ全体が複雑なためサブクエリで受注件数と受注合計額を求めます

SELECT emp_id,
      COUNT(*) AS order_count,
       SUM(amount) AS total_amount
FROM orders
GROUP BY emp_id

サブクエリの実行結果

emp_idorder_counttotal_amount
244350000
538100000
833600000

クエリの実行結果

社員の名前が必要なためemployeeテーブルと結合

nameorder_counttotal_amout
鈴木花子44350000
高橋翔38100000
中村大輔33600000

SELECT句での使用

複雑なカラム計算をSELECT句内で完結できます

各社員の名前と、その社員の受注件数を並べて表示

クエリ

SELECT e.name,
       e.salary,
       (SELECT COUNT(*) FROM orders o WHERE o.emp_id = e.emp_id) AS order_count
FROM employees e;

emp_id=1の時のサブクエリの実行結果

SELECT句で使われるサブクエリはレコード1行に対して1回実行される相関サブクエリであるので

namesalaryorder_count
田中太郎5200000

クエリの実行結果

namesalaryorder_count
田中太郎5200000
鈴木花子4800004
佐藤健一6100000
山田美咲4500000
高橋翔5300003
伊藤直樹7000000
渡辺あかり4200000
中村大輔4900003
小林由美5500000
加藤誠4700000

まとめ

サブクエリはSQL学習の中でも特に難しい分野です。

しかしサブクエリを理解することができれば複雑なクエリも簡潔に記述することができるできます。

是非、実戦でも活用して業務を効率化してみてください。

CTA
  • URLをコピーしました!
  • URLをコピーしました!
この記事を書いた人
目次