SQL 语句执行顺序是什么?

99 阅读2分钟

SQL 语句执行顺序是什么?

重要内容

  1. FROM:首先从数据表中选择数据。它决定了查询操作的数据源
  2. JOIN:如果查询包含连接(JOIN)操作,则在从表中选择数据后,执行连接操作(将多个表按指定条件合并)
  3. WHERE:对从FROMJOIN得到的数据应用筛选条件,过滤掉不符合条件的记录
  4. GROUP BY:对筛选后的数据进行分组。通常与聚合函数(如SUMCOUNT等)一起使用
  5. HAVING:对分组后的数据应用筛选条件,过滤掉不符合条件的组。HAVINGWHERE 不同,WHERE是在分组前过滤,HAVING是在分组后过滤
  6. SELECT:选择查询中需要返回的列。这个阶段是最终决定哪些列会出现在结果中的地方
  7. ORDER BY:对结果集进行排序。ORDER BY 定义了结果集的顺序
  8. 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

执行顺序示例

  1. 先确定数据源:from > on > join
  2. 其次是条件和聚合函数: where > group by > 聚合函数 > having
  3. 最后是筛选 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)