1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SQLの実行順序についてまとめてみた

1
Last updated at Posted at 2025-09-10

概要

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;

実行順序

  1. FROM employees
  2. WHERE salary > 50000
  3. GROUP BY department
  4. HAVING COUNT(*) > 5
  5. SELECT department, COUNT(*) AS emp_count
  6. 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);

実行順序

  1. INSERT INTO employees
  2. カラム指定 (name, department, salary)
  3. VALUES ('Alice', 'Sales', 60000)
  4. データ型・制約チェック
  5. INSERT実行

SELECTを使う場合

INSERT INTO employees_archive (name, department, salary)
SELECT name, department, salary
FROM employees
WHERE department = 'Sales';

実行順序

  1. INSERT INTO employees_archive
  2. カラム指定 (name, department, salary)
  3. SELECT name, department, salary
  4. FROM employees
  5. WHERE department = 'Sales'
  6. データ型・制約チェック

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';

実行順序

  1. FROM employees
  2. JOIN departments
  3. ON e.dept_id = d.id
  4. WHERE d.name = 'Sales'
  5. 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';

実行順序

  1. FROM employees e
  2. JOIN departments d
  3. ON e.department_id = d.id
  4. WHERE d.name = 'Sales'
  5. DELETE e

終わりに

実行順は今まであまり気にしたことがありませんでしたが、この内容が日々のSQL操作やパフォーマンス改善のヒントになればいいなと思いました。

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?