当前位置: 代码网 > it编程>数据库>Mysql > MySQL中SQL执行顺序及最容易踩的3个坑

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

2026年04月20日 Mysql 我要评论
一、标准执行顺序 from / join / on → where → group by → having → select → distinct → order by → limit1. from

一、标准执行顺序

 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执行顺序内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com