概要
SQLを実行した際の実行順序について、まとめてみました。
目次
前提
ここで記載するのは論理的な実行順序です。実際にはデータベースエンジンが内部で最適化して処理しますので、記載の論理順序どおりに実行されるとは限りません。
SELECT文の実行順序
1. FROM
どのテーブルやビューからデータを取得するかを決定します。
2. JOIN
テーブルを結合する際に使用するJOINが2番目になります。
3. ON
JOINでテーブルを結合した後に、ONの処理が走り結合条件を評価します。
※ONはJOINの一部ですが、JOINが評価された後にONが評価されるので、別ステップとして扱います。
4. WHERE
行レベルで条件を絞り込みます。
5. GROUP BY
指定した列でグループ化します。
6. HAVING
グループ化後の条件を絞り込みます。
7. SELECT
ここで先頭に記述する、SELECTが出てきます。
記述は先頭ですが、実際の処理は後のほうです。
取得する列や式を決定します。
集計関数(SUM, COUNT など)もここで計算します。
FROM句で定義したテーブルエイリアスは、文の最初に記載するSELECT句でも使用できます。これはFROMが先に評価されるためです。
8. DISTINCT
重複行を削除します。
※SELECTの一部として評価されます。
9. ORDER BY
並び替えを行います。
10. LIMIT / OFFSET
取得件数やスキップ件数を制御します。
例
SELECT department, COUNT(*) AS emp_count
FROM employees
WHERE salary > 50000
GROUP BY department
HAVING COUNT(*) > 5
ORDER BY emp_count DESC;
実行順序
- FROM employees
- WHERE salary > 50000
- GROUP BY department
- HAVING COUNT(*) > 5
- SELECT department, COUNT(*) AS emp_count
- ORDER BY emp_count DESC
INSERT文の実行順序
1. INSERT INTO
データを挿入する対象のテーブルを決定します。
2. カラム指定
挿入する列を指定します(省略した場合はテーブルの全列が対象)。
3. VALUES または SELECT
- VALUES:固定値を挿入する場合
- SELECT:別のテーブルから取得したデータを挿入する場合
4. サブクエリの評価(SELECTの場合)
INSERT ... SELECT構文を使う場合、SELECT文の実行順序に従ってデータを取得します。
5. 制約チェック(即時/遅延)
NOT NULL、UNIQUE、外部キー制約などを確認します。
例
VALUESを使う場合
INSERT INTO employees (name, department, salary)
VALUES ('Alice', 'Sales', 60000);
実行順序
- INSERT INTO employees
- カラム指定 (name, department, salary)
- VALUES ('Alice', 'Sales', 60000)
- データ型・制約チェック
- INSERT実行
SELECTを使う場合
INSERT INTO employees_archive (name, department, salary)
SELECT name, department, salary
FROM employees
WHERE department = 'Sales';
実行順序
- INSERT INTO employees_archive
- カラム指定 (name, department, salary)
- SELECT name, department, salary
- FROM employees
- WHERE department = 'Sales'
- データ型・制約チェック
UPDATE文の実行順序
1. FROM
どのテーブルやビューからデータを取得するかを決定します。
2. JOIN
テーブルを結合する際に使用するJOINが2番目になります。
※SQL標準ではUPDATE文でJOINは使用できませんが、多くのデータベースでJOINを使用できるように拡張されています。
3. ON
JOINでテーブルを結合した後に、ONの処理が走り結合条件を評価します。
※ONはJOINの一部ですが、JOINが評価された後にONが評価されるので、別ステップとして扱います。
4. WHERE
行レベルで条件を絞り込みます。
5. SET
指定した列の値を更新します。
例
UPDATE e
SET e.salary = e.salary * 1.1
FROM employees e
JOIN departments d ON e.dept_id = d.id
WHERE d.name = 'Sales';
実行順序
- FROM employees
- JOIN departments
- ON e.dept_id = d.id
- WHERE d.name = 'Sales'
- SET e.salary = e.salary * 1.1
DELETE文の実行順序
1. FROM
削除対象となるテーブルを決定します。
2. JOIN
複数テーブルを結合して条件を指定する場合、JOINが評価されます。
※SQL標準ではDELETE文でJOINは使用できませんが、多くのデータベースでJOINを使用できるように拡張されています。
3. ON
JOINの結合条件を評価します。
4. WHERE
削除対象の行を条件で絞り込みます。
5. DELETE
WHEREで絞り込まれた行を削除します。
例
DELETE e
FROM employees e
JOIN departments d ON e.department_id = d.id
WHERE d.name = 'Sales';
実行順序
- FROM employees e
- JOIN departments d
- ON e.department_id = d.id
- WHERE d.name = 'Sales'
- DELETE e
終わりに
実行順は今まであまり気にしたことがありませんでしたが、この内容が日々のSQL操作やパフォーマンス改善のヒントになればいいなと思いました。