MySQL中SQL执行顺序及最容易踩的3个坑

 更新时间:2026年04月19日 15:33:20   作者:踏着七彩祥云的小丑  
SQL执行顺序是MySQL核心原理之一,深入理解它有助于我们编写出更高效、更可靠的查询语句,下面这篇文章主要介绍了MySQL中SQL执行顺序及最容易踩的3个坑,文中通过代码介绍的非常详细,需要的朋友可以参考下

一、标准执行顺序

 FROM / JOIN / ON → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT

1. FROM / JOIN / ON

第一步:先找表!

  • 确定从哪张表取数据
  • 多表关联先拼接成一张大临时表

没有这一步,后面所有条件都无从谈起。

2. WHERE

第二步:过滤行!

  • 从大表里删掉不符合条件的数据
  • 对单条记录筛选
  • 不能用聚合函数(SUM/COUNT/AVG)

WHERE 越早过滤,后面计算越快。

3. GROUP BY

第三步:分组!

  • 把数据按字段分组(如按班级、性别分组)
  • 分组后,一行代表一组

4. HAVING

第四步:过滤分组!

  • 分组后的结果筛选
  • 可以用聚合函数
  • 必须在 GROUP BY 之后

WHERE 过滤行
HAVING 过滤组

5. SELECT

第五步:查要显示的列!

  • 最后才计算你要查的字段
  • 计算别名、表达式、函数
  • 聚合函数(SUM/COUNT)在这里执行

⚠️ 重点:WHERE 中不能用 SELECT 里的别名
因为 WHERE 比 SELECT 先执行!

6. DISTINCT

第六步:去重!

  • 对查询结果去掉重复行
  • 在 SELECT 之后执行

7. ORDER BY

第七步:排序!

  • 对最终结果排序
  • 可以用别名
  • 执行非常靠后

8. LIMIT

第八步:截取前几条!

  • 最后一步,只返回你要的行数

二、 SQL 完整演示执行顺序

你写的 SQL:

SELECT 
  class_name, COUNT(*) AS num
FROM student
WHERE age > 18
GROUP BY class_name
HAVING num > 10
ORDER BY num DESC
LIMIT 5;

真正执行顺序:

  1. FROM student 找到表
  2. WHERE age>18 过滤年龄
  3. GROUP BY class_name 按班级分组
  4. HAVING num>10 只保留人数>10的班级
  5. SELECT 计算班级名和数量
  6. ORDER BY 排序
  7. LIMIT 取前5

三、最容易踩的 3 个坑(必须记住)

坑1:WHERE 里不能用 SELECT 的别名

-- 错误
SELECT name AS n FROM student WHERE n='张三'

原因:WHERE 比 SELECT 先执行,根本不知道 n 是什么。

坑2:WHERE 不能用聚合函数

-- 错误
SELECT COUNT(*) FROM student WHERE COUNT(*)>10

正确写法:

SELECT COUNT(*) FROM student GROUP BY class HAVING COUNT(*)>10

坑3:HAVING 必须跟 GROUP BY

没有分组,就不能用 HAVING。

总结(最核心 3 条)

  1. FROM 最先执行
  2. WHERE 在 GROUP BY 前面
  3. SELECT 在 HAVING 之后、ORDER BY 之前

总结 

到此这篇关于MySQL中SQL执行顺序及最容易踩的3个坑的文章就介绍到这了,更多相关MySQL SQL执行顺序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

最新评论