はじめに
サブクエリとは、SQLの中に書かれた別のSQLです。
本記事では、SELECT / FROM / INSERT / UPDATE / DELETE それぞれの文での具体例を示しながら、初心者でも理解できるように解説します。
対象読者
SQL初心者〜中級者
SELECT文だけでなく、INSERT・UPDATE・DELETEでもサブクエリを使いたい方
データベース操作を効率化したい方
記事のゴール
サブクエリの基本的な書き方を理解する
SELECT / FROM / INSERT / UPDATE / DELETEでの使い方を具体例で学ぶ
実務でサブクエリを活用できるようになる
サブクエリとは?
サブクエリとは、SQLの中に書かれた別のSQLのことです。
用途は大きく分けて3つ:
- 条件に使う
- 値として使う
- 一時テーブルとして使う
以下、具体例を挙げて確認してみます。
1. SELECT文でのサブクエリ(条件に使う)
🔸 従業員の給与が平均給与より高い人を取得する例
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
サブクエリ (SELECT AVG(salary) FROM employees) が平均給与を計算し、WHERE句で平均よりも給料の高い人を絞り込んでいます。
2. FROM句でのサブクエリ(一時テーブルとして使う)
🔸 特定の従業員をあらかじめ先にSELECTする例
SELECT emp.name, dep.department
FROM (
SELECT name, department_id
FROM employees
WHERE hire_date >= '2020-01-01'
) AS emp
JOIN departments AS dep
ON emp.department_id = dep.id;
サブクエリではあらかじめ2020年以降に入社した従業員を絞り込み、一時テーブルとして利用しています。
その後、departmentsテーブルとJOINして部署名を取得しています。
employeesテーブルとdepartmentsテーブルをJOINしてから絞り込むよりも保守性が上がり、クエリによっては効率よく実行されます。
3. INSERT文でのサブクエリ(値として使う)
🔸 田中さんの従業員IDをサブクエリで取得し、ログに追加する例
INSERT INTO employee_log (employee_id, action, date)
VALUES (
(SELECT id FROM employees WHERE name = '田中'),
'login',
NOW()
);
サブクエリが値として使われています。
テーブルからテーブルへスムーズにデータを登録できます。
4. UPDATE文でのサブクエリ(条件に使う)
🔸 営業部門の従業員の給与を10%増加する例
UPDATE employees
SET salary = salary * 1.1
WHERE department_id IN (SELECT id FROM departments WHERE name = '営業部門');
サブクエリで営業部門のIDを取得して、UPDATE対象を絞り込んでいます。
5. DELETE文でのサブクエリ(条件に使う)
🔸 人事部門の従業員データを削除する例
DELETE FROM employees
WHERE department_id IN (SELECT id FROM departments WHERE name = '人事部門');
サブクエリで削除対象の部門IDを取得しています。
まとめ
サブクエリは、SQLの中で別のSQLを実行して結果を取得する仕組みのことで、用途に応じて3つの使い方があります。
- 条件に使う(WHERE, HAVINGなど)
- 値として使う(INSERT, UPDATEなど)
- 一時テーブルとして使う(FROM句)
初めはSELECT文でのサブクエリから練習すると理解しやすいです。
実務ではJOINやINと組み合わせると効率的にデータ操作ができます。
最後に
記事を読んでくださった方は、是非弊社開発課のXもフォローしてください。
毎日エンジニアに向けた情報発信を行っています。