插件窝 干货文章 SQL中的having子句和select子句,究竟哪个先执行?

SQL中的having子句和select子句,究竟哪个先执行?

HAVING SELECT 执行 分组 713    来源:    2025-03-30

SQL中HAVING和SELECT子句的执行顺序

在SQL查询中,HAVING和SELECT子句的执行顺序是理解SQL查询处理逻辑的重要部分。正确的执行顺序是:

标准SQL查询执行顺序

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

HAVING vs SELECT

关键点:HAVING子句在SELECT子句之前执行

为什么这个顺序很重要

  1. HAVING过滤的是分组后的结果,它可以使用聚合函数(如COUNT, SUM等)来过滤
  2. SELECT是在分组和过滤之后才执行的,它决定了最终返回的列

示例说明

SELECT department, COUNT(*) as emp_count
FROM employees
GROUP BY department
HAVING COUNT(*) > 5
ORDER BY emp_count DESC;

在这个例子中: 1. 首先从employees表获取数据 2. 按department分组 3. 使用HAVING过滤掉员工数≤5的部门 4. 然后SELECT选择要返回的列(包括计算emp_count) 5. 最后按emp_count排序

常见误区

  • 错误认为SELECT先执行,因为它在语法上写在前面
  • 试图在HAVING中使用SELECT中定义的别名(实际上不能这样做,因为HAVING先执行)
  • 在WHERE中使用聚合函数(应该用HAVING)

理解这个执行顺序有助于编写正确高效的SQL查询,特别是在处理分组和聚合时。