SQL 中 select、from、join、where、group by、having、order by、limit 的执行顺序是什么?
在 SQL 查询中虽然我们在编写语句时的顺序是SELECT-FROM-JOIN-WHERE-GROUP BY-HAVING-ORDER BY-LIMIT但数据库引擎实际执行的顺序是不同的。理解这个执行顺序对于优化查询性能、避免逻辑错误比如在 WHERE 中使用了聚合函数至关重要。SQL 查询的实际执行顺序FROM(包括CROSS JOIN,INNER JOIN)首先确定数据来源加载指定的表。JOIN(包括LEFT JOIN,RIGHT JOIN,FULL JOIN等)将FROM子句中的表与其他表进行连接生成一个临时的连接结果集。注FROM 和 JOIN 通常被视为一个整体步骤先确定主表再依次连接其他表。WHERE对连接后的临时结果集进行行级过滤。注意此时数据尚未分组因此不能在 WHERE 中使用聚合函数如SUM,COUNT。GROUP BY将过滤后的数据按照指定的列进行分组。HAVING对分组后的结果进行过滤。注意这里可以使用聚合函数如HAVING COUNT(*) 5。SELECT选择需要返回的列。此时可以进行列的别名定义、计算列、去重DISTINCT等操作。注因为 SELECT 执行较晚所以 ORDER BY 和 LIMIT 可以使用 SELECT 中定义的别名但 WHERE 和 GROUP BY 通常不能取决于具体数据库实现标准 SQL 中 WHERE/GROUP BY 不能引用 SELECT 别名。DISTINCT(如果使用了SELECT DISTINCT)对 SELECT 的结果进行去重。ORDER BY对最终的结果集进行排序。LIMIT(或TOP,FETCH FIRST)限制返回的行数。执行顺序图解与示例假设我们有以下 SQL 语句SELECTdepartment_id,COUNT(*)asemp_countFROMemployeesJOINdepartmentsONemployees.dept_iddepartments.idWHEREemployees.salary5000GROUPBYdepartment_idHAVINGCOUNT(*)10ORDERBYemp_countDESCLIMIT5;数据库引擎的执行步骤如下FROM JOIN:从employees表开始。与departments表进行JOIN操作生成一个包含员工和部门信息的临时大表。WHERE:在临时大表中筛选出salary 5000的行。此时COUNT(*)还不存在所以不能在 WHERE 中写COUNT(*) 10。GROUP BY:将筛选后的行按照department_id进行分组。HAVING:检查每个分组只保留COUNT(*) 10的组。SELECT:提取department_id和计算COUNT(*)并命名为emp_count。ORDER BY:根据emp_count(别名) 进行降序排列。LIMIT:只取前 5 行返回给用户。常见误区提醒误区 1在 WHERE 中使用聚合函数错误WHERE COUNT(*) 5原因WHERE 在 GROUP BY 之前执行此时还没有分组无法计算聚合值。修正使用HAVING COUNT(*) 5。误区 2在 WHERE 中使用 SELECT 定义的别名错误SELECT salary * 1.1 AS new_salary FROM table WHERE new_salary 1000原因WHERE 在 SELECT 之前执行此时new_salary还不存在。修正在 WHERE 中重复计算逻辑WHERE salary * 1.1 1000或者使用子查询/CTE。误区 3认为 LIMIT 会先执行错误认为LIMIT 10会先取 10 行然后再排序。原因LIMIT 是最后执行的。如果不先ORDER BY排序直接LIMIT取出的数据是随机的取决于物理存储顺序。总结记忆口诀从 (FROM) 连 (JOIN) 过 (WHERE) 组 (GROUP BY) 滤 (HAVING)选 (SELECT) 去 (DISTINCT) 排 (ORDER BY) 限 (LIMIT)。这个顺序是理解 SQL 逻辑和优化查询性能的基础。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2437160.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!