SQL 语句执行顺序是什么?
重要内容
- FROM:首先从数据表中选择数据。它决定了查询操作的数据源
- JOIN:如果查询包含连接(JOIN)操作,则在从表中选择数据后,执行连接操作(将多个表按指定条件合并)
- WHERE:对从
FROM和JOIN得到的数据应用筛选条件,过滤掉不符合条件的记录 - GROUP BY:对筛选后的数据进行分组。通常与聚合函数(如
SUM、COUNT等)一起使用 - HAVING:对分组后的数据应用筛选条件,过滤掉不符合条件的组。
HAVING与WHERE不同,WHERE是在分组前过滤,HAVING是在分组后过滤 - SELECT:选择查询中需要返回的列。这个阶段是最终决定哪些列会出现在结果中的地方
- ORDER BY:对结果集进行排序。
ORDER BY定义了结果集的顺序 - LIMIT:限制返回的行数。通常用于分页或限制结果集的大小
扩展内容
执行顺序的典型陷阱
场景 1:在 WHERE 中使用 SELECT 的别名
SELECT age + 1 AS adjusted_age
FROM users
WHERE adjusted_age > 20; -- 报错!WHERE 执行时 SELECT 尚未处理
修正方式:改用原始表达式
WHERE age + 1 > 20
场景 2:在 HAVING 中使用 SELECT 的别名
SELECT country, COUNT(*) AS total
FROM users
GROUP BY country
HAVING total > 100; -- 报错!HAVING 执行时 SELECT 尚未处理
修正方式:改用聚合函数
HAVING COUNT(*) > 100
执行顺序示例
- 先确定数据源:from > on > join
- 其次是条件和聚合函数: where > group by > 聚合函数 > having
- 最后是筛选 select > distinct > order by > limit
原始查询
select
country,
COUNT(*) as cnt
from
users
join orders on
users.id = orders.user_id
where
age > 18
group by
country
having
COUNT(*) > 100
order by
cnt desc
limit 5;
执行流程
1. 加载 users 和 orders 表 → JOIN 合并数据
2. 过滤出 age > 18 的行(WHERE)
3. 按 country 分组(GROUP BY)
4. 过滤出组内行数 > 100 的分组(HAVING)
5. 选择 country 和行数(SELECT)
6. 按 cnt 降序排序(ORDER BY)
7. 返回前 5 条(LIMIT)