MySQL——SQL执行顺序
SQL执行顺序一、标准执行顺序1. FROM / JOIN / ON2. WHERE3. GROUP BY4. HAVING5. SELECT6. DISTINCT7. ORDER BY8. LIMIT三、 SQL 完整演示执行顺序四、最容易踩的 3 个坑必须记住坑1WHERE 里不能用 SELECT 的别名坑2WHERE 不能用聚合函数坑3HAVING 必须跟 GROUP BY总结最核心 3 条一、标准执行顺序FROM/JOIN/ON→WHERE→GROUPBY→HAVING→SELECT→DISTINCT→ORDERBY→LIMIT1. FROM / JOIN / ON第一步先找表确定从哪张表取数据多表关联先拼接成一张大临时表没有这一步后面所有条件都无从谈起。2. WHERE第二步过滤行从大表里删掉不符合条件的数据对单条记录筛选不能用聚合函数SUM/COUNT/AVGWHERE 越早过滤后面计算越快。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 完整演示执行顺序你写的 SQLSELECTclass_name,COUNT(*)ASnumFROMstudentWHEREage18GROUPBYclass_nameHAVINGnum10ORDERBYnumDESCLIMIT5;真正执行顺序FROM student 找到表WHERE age18 过滤年龄GROUP BY class_name 按班级分组HAVING num10 只保留人数10的班级SELECT 计算班级名和数量ORDER BY 排序LIMIT 取前5四、最容易踩的 3 个坑必须记住坑1WHERE 里不能用 SELECT 的别名-- 错误SELECTnameASnFROMstudentWHEREn张三原因WHERE 比 SELECT 先执行根本不知道 n 是什么。坑2WHERE 不能用聚合函数-- 错误SELECTCOUNT(*)FROMstudentWHERECOUNT(*)10正确写法SELECTCOUNT(*)FROMstudentGROUPBYclassHAVINGCOUNT(*)10坑3HAVING 必须跟 GROUP BY没有分组就不能用 HAVING。总结最核心 3 条FROM 最先执行WHERE 在 GROUP BY 前面SELECT 在 HAVING 之后、ORDER BY 之前