通过实例理解SQL查询语句的执行顺序

💡 原文中文,约6200字,阅读约需15分钟。
📝

内容提要

本文介绍了SQL查询语句的执行顺序,通过实例演示了各个子句的执行过程,帮助读者理解SQL查询语句的执行顺序,为编写高效的SQL查询提供基础。

🔎

延伸解读

为什么执行顺序与书写顺序不同

SQL 子句的书写顺序(SELECT 在前)与执行顺序(SELECT 靠后)并不一致。文章指出,FROM 和 JOIN 最先执行,为后续操作提供数据集合;WHERE 在分组前过滤行;GROUP BY 分组并计算聚合;HAVING 在分组后过滤组;SELECT 才进行投影;最后是 ORDER BY 和 LIMIT。理解这一顺序,才能避免因误判执行时机而写出错误查询。

WHERE 与 HAVING 的关键区别

文章通过实例强调,WHERE 在数据分组之前起作用,用于过滤原始行,减少后续操作的数据量;HAVING 则在分组之后起作用,用于过滤分组后的结果,通常针对聚合条件。例如,WHERE e.salary > 10000 先筛掉低薪记录,而 HAVING AVG(e.salary) > 50000 再筛掉平均工资不达标的部门。混淆两者会导致查询报错或结果不符预期。

GROUP BY 对 SELECT 列的限制

文章指出,使用 GROUP BY 分组时,SELECT 投影的列必须是可分组的列,比如 dept_name 或 dept_id。如果 SELECT 中包含不可分组的列(如 emp_id、name),查询语句就会报错。这是因为分组后每个组只保留聚合值,非分组列无法确定唯一值。编写查询时需确保 SELECT 列与 GROUP BY 列兼容,或使用聚合函数包裹。

LIMIT 的实际生效时机

LIMIT 在 ORDER BY 之后执行,用于限制最终结果集的记录数量。文章示例中,HAVING 过滤后只剩 HR 和 Engineering 两个部门,ORDER BY 按平均工资降序排列,最后 LIMIT 3 虽然要求输出 3 条,但实际只有 2 条记录,因此最终结果就是这 2 条。这说明 LIMIT 不会改变前面子句已经确定的数据内容,只控制输出条数。

❓

Q&A

SQL查询语句的执行顺序是什么?

SQL查询语句的执行顺序为:FROM和JOIN -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY -> LIMIT。

WHERE子句在SQL查询中有什么作用?

WHERE子句用于筛选满足条件的记录,减少后续操作的数据量。

GROUP BY子句如何影响SQL查询的结果?

GROUP BY子句将结果集按指定列分组,并计算聚合值。

HAVING子句与WHERE子句有什么不同?

HAVING子句在分组后过滤结果,而WHERE子句在数据分组之前过滤原始数据。

LIMIT子句在SQL查询中有什么用?

LIMIT子句用于限制结果集的记录数量,控制输出的结果条数。

如何通过实例理解SQL查询的执行顺序?

通过实例分析SQL查询语句的执行顺序,可以逐步理解各个子句的执行过程及其影响。

🏷️

标签

➡️

继续阅读