DevToolBox

SQL GROUP BYORDER BY の順序・使い分け

実務で頻出する集計クエリは、句の順序と選択列の制約を押さえれば迷いません。本稿では 書き順・評価順、SELECT に書ける列の制約、 PostgreSQL / MySQL / BigQuery の挙動差をまとめます。

A concise reference for the write-order, evaluation-order, SELECT-column constraints, and dialect differences between GROUP BY and ORDER BY.

TL;DR

1. 典型クエリ / Canonical query

SELECT user_id,
       COUNT(*)  AS orders,
       SUM(amount) AS total
FROM orders
WHERE created_at >= '2026-01-01'
GROUP BY user_id
HAVING SUM(amount) >= 10000
ORDER BY total DESC
LIMIT 50;

WHERE は行フィルタ、HAVING は集計後フィルタ。混同すると パフォーマンス劣化や意図しない結果になります。

2. SELECT に書ける列の制約 / Column rule

DB / DialectGROUP BY 外の列挙動
PostgreSQL不可column must appear in GROUP BY
MySQL (ONLY_FULL_GROUP_BY on)不可5.7+ デフォルトで有効
MySQL (off)任意行が返る(非決定的)
BigQuery不可ANY_VALUE() で明示
SQL Server / Oracle不可ANSI 準拠

3. ORDER BY の書き方 / ORDER BY tips

4. GROUP BY の落とし穴 / Pitfalls

5. English summary

In SQL, GROUP BY is always written before ORDER BY. The full evaluation order is FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT, which also explains why HAVING can reference aggregates but WHEREcannot. In all major dialects except MySQL with ONLY_FULL_GROUP_BY disabled, every non-aggregate column in SELECT must appear in GROUP BY. When porting MySQL code, validate against Postgres or BigQuery early.

関連ツール / Related tools

関連ガイド / Related guides