插件窝 干货文章 SQL 子句执行顺序:先 HAVING 还是先 SELECT?

SQL 子句执行顺序:先 HAVING 还是先 SELECT?

HAVING 执行 分组 salary 183    来源:    2025-03-31

SQL 子句执行顺序解析

在SQL查询中,子句的执行顺序与它们在查询中的书写顺序不同。对于HAVING和SELECT的执行顺序问题:

标准SQL执行顺序

  1. FROM - 确定数据来源
  2. WHERE - 对行进行筛选
  3. GROUP BY - 对数据进行分组
  4. HAVING - 对分组结果进行筛选
  5. SELECT - 选择要返回的列
  6. DISTINCT - 去重
  7. ORDER BY - 排序结果
  8. LIMIT/OFFSET - 限制返回行数

关键结论

HAVING在SELECT之前执行。这是因为: - HAVING筛选的是GROUP BY之后的分组结果 - SELECT则是在HAVING筛选之后才确定最终返回的列

示例说明

SELECT department, AVG(salary) as avg_salary
FROM employees
WHERE hire_date > '2020-01-01'
GROUP BY department
HAVING AVG(salary) > 50000
ORDER BY avg_salary DESC;

执行流程: 1. 从employees表获取数据 2. 筛选hire_date > '2020-01-01'的记录 3. 按department分组 4. 筛选出平均工资>50000的分组 5. 计算并选择department和AVG(salary)作为结果列 6. 按avg_salary降序排列

注意事项

  • HAVING中可以使用聚合函数(如AVG, COUNT等),而WHERE不能
  • 虽然HAVING在SELECT之前执行,但在HAVING中可以使用SELECT中定义的别名(如示例中的avg_salary),这是因为SQL引擎会进行优化处理