一、标准执行顺序
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;
真正执行顺序:
- from student 找到表
- where age>18 过滤年龄
- group by class_name 按班级分组
- having num>10 只保留人数>10的班级
- select 计算班级名和数量
- order by 排序
- 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 条)
- from 最先执行
- where 在 group by 前面
- select 在 having 之后、order by 之前
总结
到此这篇关于mysql中sql执行顺序及最容易踩的3个坑的文章就介绍到这了,更多相关mysql sql执行顺序内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论