SQLクエリの実行順序は、理解しておくとクエリの構築やデバッグがしやすくなります。
SQLは一見、上から順に実行されているように見えますが、実際の実行順序は異なります。
以下、SQLクエリの典型的な実行順序とそれぞれの段階について詳しく解説します。
SQLクエリの実行順序
SQLクエリが実行される際の順序は以下のようになります。
ここでは、シンプルなSELECT
文を元に解説を進めます。
- FROM:テーブルの指定
- JOIN:テーブルの結合
- WHERE:行のフィルタリング
- GROUP BY:グループ化の指定
- HAVING:グループ化後の条件
- SELECT:列の選択
- DISTINCT:重複行の削除
- ORDER BY:並び順の指定
- LIMIT/OFFSET:取得行数の制限
それぞれの段階について、さらに詳しく見ていきましょう。
FROM:テーブルの指定
クエリが実行される際、最初にFROM句で指定されたテーブルが読み込まれます。
複数のテーブルを使用する場合は、最初にここでデータの土台が決定されます。
例えば、SELECT * FROM customers
ではcustomers
テーブルのデータを取得する準備をします。
JOIN:テーブルの結合
JOIN句がある場合、ここで実際に結合処理が行われます。
内部結合(INNER JOIN)、外部結合(LEFT JOIN, RIGHT JOIN)などが適用され、それぞれの条件に従ってテーブルが統合されます。
JOIN句でテーブルを組み合わせる際に使う条件は、ON句で指定します。
WHERE:行のフィルタリング
次に、WHERE句によって行レベルでのフィルタリングが行われます。
ここでは条件に合致しない行が除外され、データセットがさらに絞り込まれます。
WHERE age > 18
のように指定すると、条件を満たす行のみがこの後の処理に進みます。
GROUP BY:グループ化の指定
GROUP BY句によって、指定されたカラムでデータがグループ化されます。
たとえば、売上データの表で商品ごとに売上を集計する場合、この句が使用されます。
GROUP BY product_id
とすることで、product_id
ごとにデータがまとめられます。
HAVING:グループ化後の条件
HAVING句は、グループ化されたデータに対して追加の条件を指定する場合に使用します。
WHERE句
と異なり、HAVING句はグループ化後の集計結果に対してフィルタをかけるため、集計関数(SUM, COUNTなど)を条件に使えます。
SELECT:列の選択
SELECT句で、最終的に取得したい列が選択されます。
この段階で、指定した列や集計関数の結果が得られ、最終的な出力の準備が整います。
DISTINCT:重複行の削除
DISTINCT句が指定されている場合、この段階で重複する行が削除され、ユニークな行だけが残ります。
ORDER BY:並び順の指定
ORDER BY句で、結果セットの並び順を指定します。
昇順(ASC)や降順(DESC)を指定することで、出力結果が整列されます。
LIMIT/OFFSET:取得行数の制限
最後に、LIMIT句やOFFSET句で取得する行数を制限します。
例えば、LIMIT 10
と指定することで、上位10行だけが取得されます。
実行順序を踏まえたクエリの例
以下に、複数の句を含んだクエリ例を示し、それが実行される順序に沿って解説します。
SELECT product_id, COUNT(*) AS order_count
FROM orders
WHERE order_date > '2024-01-01'
GROUP BY product_id
HAVING COUNT(*) > 10
ORDER BY order_count DESC
LIMIT 5;
このクエリの実行順序は次のようになります。
- FROM
orders
テーブルが読み込まれる。 - WHERE
order_date > '2024-01-01'
で指定された条件に基づき、日付が2024年以降の行がフィルタされる。 - GROUP BY
product_id
でグループ化される。 - HAVING
グループ化後にCOUNT(*) > 10
の条件でフィルタリングされる。 - SELECT
product_id
とorder_count
(カウントの結果)が選択される。 - ORDER BY
order_count
の降順で並び替えられる。 - LIMIT
上位5件だけが取得される。
まとめ
SQLクエリの実行順序は、コードの記述順とは異なるため、誤解が生じやすいポイントです。各句の役割と実行順序を理解することで、効率的で意図通りの結果を得られるクエリを構築できるようになります。