SELECT DISTINCT
FROM
JOIN
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT/OFFSET
实际执行顺序
| 顺序 | 关键字 | 说明 |
|---|---|---|
| 1 | FROM | 加载左表数据 |
| 2 | JOIN | 连接右表,生成笛卡尔积/匹配行 |
| 3 | ON | 筛选连接条件(JOIN 的过滤) |
| 4 | WHERE | 逐行过滤数据(不能使用聚合函数) |
| 5 | GROUP BY | 分组聚合 |
| 6 | HAVING | 过滤分组后的数据(可以使用聚合函数) |
| 7 | SELECT | 选择列、计算表达式、去重 |
| 8 | DISTINCT | 去重 |
| 9 | ORDER BY | 排序 |
| 10 | LIMIT/OFFSET | 限制返回行数 |
关键理解示例
SELECT
dept_id,
AVG(salary) as avg_salary
FROM employees e
JOIN departments d ON e.dept_id = d.id
WHERE e.status = 'active' -- 第4步执行,过滤原始行
GROUP BY dept_id -- 第5步执行
HAVING AVG(salary) > 50000 -- 第6步执行,过滤分组
ORDER BY avg_salary DESC -- 第9步执行
LIMIT 10; -- 第10步执行
注意事项
-
WHERE 不能使用聚合函数(如
SUM(),AVG()),要用 HAVING -
别名 在 SELECT 阶段才生成,所以 WHERE 中不能用别名,ORDER BY 中可以
-
执行顺序是逻辑顺序,数据库优化器可能会重排以提高性能,但结果等价