mysql查询语句执行顺序 一、编写查询SQL顺序1.select 2.from 3.join on 4.where 5.group by 6.having 7.order by 8.limit二、MySQL执行顺MySQL 查询语句的‌书写顺序‌与‌实际执行顺序‌存在显著差异。理解这一机制对于编写高效 SQL、避免常见错误如别名引用问题至关重要。 1. 核心执行顺序 MySQL 解析器会将 SQL 语句按照以下逻辑步骤依次执行每一步都会生成一张虚拟表作为下一步的输入 ‌FROM‌确定数据来源加载表数据。 ‌ON‌对多表连接进行初步过滤仅针对 JOIN 条件。 ‌JOIN‌执行表连接操作合并数据。 ‌WHERE‌对合并后的数据进行行级过滤剔除不满足条件的行。 ‌GROUP BY‌对数据进行分组。 ‌HAVING‌对分组后的数据进行过滤通常配合聚合函数使用。 ‌SELECT‌选择需要返回的字段计算表达式生成别名。 ‌DISTINCT‌对结果集进行去重。 ‌ORDER BY‌对最终结果集进行排序。 ‌LIMIT‌限制返回的行数。 ‌记忆口诀‌从哪来 (FROM) → 怎么连 (JOIN/ON) → 筛原始 (WHERE) → 怎么分 (GROUP BY) → 筛分组 (HAVING) → 选什么 (SELECT) → 去重复 (DISTINCT) → 怎么排 (ORDER BY) → 取多少 (LIMIT)。三、MySQL执行顺序理解第一步加载from子句的前两个表计算笛卡尔积生成虚拟表vt1第二步筛选关联表符合on表达式的数据保留主表生成虚拟表vt2第三步如果使用的是外连接执行on的时候会将主表中不符合on条件的数据也加载进来做为外部行第四步如果from子句中的表数量大于2则重复第一步到第三步直至所有的表都加载完毕更新vt3第五步执行where表达式筛选掉不符合条件的数据生成vt4第六步执行group by子句。group by 子句执行过后会对子句组合成唯一值并且对每个唯一值只包含一行生成vt5,。一旦执行group by后面的所有步骤只能得到vt5中的列(group by的子句包含的列)和聚合函数。第七步执行聚合函数生成vt6第八步执行having表达式筛选vt6中的数据。having是唯一一个在分组后的条件筛选生成vt7;第九步从vt7中筛选列生成vt8第十步执行distinct对vt8去重生成vt9。其实执行过group by后就没必要再去执行distinct因为分组后每组只会有一条数据并且每条数据都不相同。第十一步对vt9进行排序此处返回的不是一个虚拟表而是一个游标记录了数据的排序顺序此处可以使用别名第十二步执行limit语句将结果返回给客户端四. 关键注意事项与常见坑由于执行顺序的影响以下场景需特别注意‌WHERE 中不能使用 SELECT 别名‌‌原因‌WHERE在SELECT之前执行此时别名尚未生成。‌错误示例‌SELECT age AS user_age FROM users WHERE user_age 18;报错‌正确做法‌SELECT age AS user_age FROM users WHERE age 18;‌HAVING 与 WHERE 的区别‌‌WHERE‌在分组前过滤‌原始行‌不能使用聚合函数如SUM,COUNT。‌HAVING‌在分组后过滤‌分组结果‌可以使用聚合函数。‌示例‌找出平均成绩大于 80 的班级。SELECT class_id, AVG(score) FROM students GROUP BY class_id HAVING AVG(score) 80; -- 正确HAVING 在 GROUP BY 之后ORDER BY 可以使用 SELECT 别名‌‌原因‌ORDER BY在SELECT之后执行此时别名已经生成。‌示例‌SELECT age AS user_age FROM users ORDER BY user_age DESC;合法‌性能优化启示‌‌尽早过滤‌尽量在WHERE阶段利用索引过滤掉大量无效数据减少后续GROUP BY和ORDER BY的处理量。‌**避免 SELECT ***‌SELECT阶段才确定返回字段指定具体字段可以减少网络传输和内存开销。理解这一执行顺序能帮助你更准确地预判 SQL 行为写出逻辑正确且性能更优的查询语句。