插件窝 干货文章 SQL语句中,having子句是在select子句之前执行的吗?

SQL语句中,having子句是在select子句之前执行的吗?

子句 执行 HAVING 过滤 301    来源:    2025-03-30

SQL执行顺序解析:HAVING子句

不,HAVING子句不是在SELECT子句之前执行的。SQL语句的逻辑执行顺序如下:

  1. FROM子句(确定数据来源)
  2. WHERE子句(行级过滤)
  3. GROUP BY子句(分组)
  4. HAVING子句(组级过滤)
  5. SELECT子句(选择列)
  6. ORDER BY子句(排序)
  7. LIMIT/OFFSET子句(限制结果)

关键点说明

  • HAVING在GROUP BY之后执行:它用于过滤分组后的结果
  • HAVING在SELECT之前执行:这意味着HAVING中可以使用聚合函数,但不能使用SELECT中定义的列别名

示例

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. 先执行FROM获取employees表数据 2. 执行WHERE过滤符合条件的行 3. 执行GROUP BY按部门分组 4. 执行HAVING过滤平均工资>50000的部门 5. 执行SELECT计算并命名avg_salary 6. 最后执行ORDER BY排序

注意事项

  • HAVING中可以使用聚合函数但不能使用列别名
  • WHERE和HAVING的区别:WHERE过滤行,HAVING过滤组
  • 不是所有SQL实现都严格遵循这个顺序,但逻辑上是这样处理的