`FROM` → `WHERE` → `GROUP BY` → `HAVING` → `SELECT` → `ORDER BY`

发布时间:2026/7/9 1:47:52

`FROM` → `WHERE` → `GROUP BY` → `HAVING` → `SELECT` → `ORDER BY` ✅WHERE用于分组前的行级过滤作用于原始数据行因此不能使用聚集函数如COUNT()、SUM()、AVG()等因为此时数据尚未分组聚集函数无意义。✅HAVING用于分组后的组级过滤作用于GROUP BY产生的每个分组结果因此可以且通常需要使用聚集函数来筛选满足条件的分组例如HAVING COUNT(*) 5。执行顺序逻辑顺序非书写顺序为FROM→WHERE→GROUP BY→HAVING→SELECT→ORDER BY 示例对比-- ✅ 正确WHERE 过滤单个订单不涉及聚集SELECTcustomer_id,COUNT(*)FROMordersWHEREorder_date2024-01-01-- 行级条件合法GROUPBYcustomer_idHAVINGCOUNT(*)3;-- 组级条件用聚集函数合法-- ❌ 错误WHERE 中使用聚集函数语法报错-- WHERE COUNT(*) 3 -- 不允许应该在HAVING中写AVG(salary) 10000不能在WHERE中写。✅ 正确写法SELECTdepartment,AVG(salary)ASavg_salaryFROMemployeesGROUPBYdepartmentHAVINGAVG(salary)10000;❌ 错误写法语法错误SELECTdepartment,AVG(salary)FROMemployeesWHEREAVG(salary)10000-- ❌ 报错WHERE 无法使用聚集函数GROUPBYdepartment; 原因如下WHERE在逻辑执行顺序中位于GROUP BY之前此时数据尚未按部门分组每行仍是独立员工记录AVG(salary)尚未计算无“部门平均”这一概念因此 SQL 引擎不允许在WHERE中使用聚集函数。HAVING在GROUP BY之后执行此时已形成每个部门的一组数据AVG(salary)可对每组独立计算因此可安全用于过滤满足条件的部门组。⚠️ 补充说明即使你先用子查询或 CTE 预先算出各部门平均工资那也是将聚集结果“物化”为普通列后才可在外层WHERE过滤——但这不改变WHERE本身不能直接调用聚集函数的本质规则。

相关新闻