SQL 中 select、from、join、where、group by、having、order by、limit 的执行顺序?

SQL 的执行顺序通常为:from->join->where->group by->having->select->order by->limit。

一、SQL关键字的实际执行顺序

  1. FROMJOIN(含ON条件)

    • 作用:确定数据来源表,执行表连接操作并应用连接条件(如ON users.id = orders.user_id)。

    • 执行逻辑:首先生成原始数据集(笛卡尔积),再根据连接条件筛选有效数据。

  2. WHERE

    • 作用:过滤行级数据,排除不满足条件的记录。

    • 限制:不可使用聚合函数(如COUNT,SUM),因为分组尚未发生。

    • 示例WHERE hire_date > '2020-01-01'

  3. GROUP BY

    • 作用:按指定列分组数据,为聚合计算做准备。

    • 注意:SELECT中的非聚合列必须出现在GROUP BY中。

  4. HAVING

    • 作用:过滤分组后的数据可使用聚合函数

    • 与WHERE区别:WHERE在分组前过滤行,HAVING在分组后过滤组。

    • 示例HAVING COUNT(*) > 5

  5. SELECT

    • 作用:选择最终返回的列,计算表达式或聚合值(如AVG(salary)),并定义别名。

    • 关键点:此时生成的列别名(如avg_salary)可被后续ORDER BY使用,但不可用于WHEREGROUP BY(因二者先于SELECT执行)。

  6. DISTINCT

    • 作用:对 SELECT 的结果去重(若有 DISTINCT关键字)。

  7. ORDER BY

    • 作用:按指定列排序结果集,可使用SELECT中的别名

    • 示例:ORDER BY avg_salary DESC。

  8. LIMIT/OFFSET

    • 作用:限制返回行数或跳过指定行,最后执行。

二、常见误区与原理分析

  1. WHEREHAVING 混淆

    • 错误示例:

      SELECT department, AVG(salary) AS avg_salary
      FROM employees
      WHERE avg_salary > 10000  -- 错误!WHERE不能使用别名或聚合函数
      GROUP BY department;
    • 修正:将条件移至HAVING:HAVING AVG(salary) > 10000。

  2. 别名使用范围

    • SELECT别名仅在ORDER BYLIMIT中生效,在 WHERE 、GROUP BY、HAVING中无效(因执行顺序优先)。

  3. 性能优化原则

    • 尽早过滤数据:在 WHERE 中尽量缩小数据集,减少后续分组和排序的计算量。

    • 避免冗余操作:不必要的 GROUP BY 或复杂 HAVING 条件会显著降低效率。

三、执行顺序对比表

关键字书写顺序执行顺序可用聚合函数可用SELECT别名
FROM / JOIN21
WHERE32
GROUP BY43
HAVING54✔️
SELECT15✔️❌(自身定义)
ORDER BY67✔️✔️
LIMIT78✔️

四、完整示例解析

SELECT department, COUNT(*) AS emp_count  -- 5. 选择字段并定义别名
FROM employees e
JOIN departments d ON e.dept_id = d.id   -- 1. 连接表
WHERE e.hire_date > '2020-01-01'         -- 2. 过滤入职时间
GROUP BY department                      -- 3. 按部门分组
HAVING COUNT(*) > 5                     -- 4. 过滤分组(员工数>5)
ORDER BY emp_count DESC                 -- 6. 按别名排序
LIMIT 3;                                -- 7. 限制结果数

总结

SQL引擎的实际执行顺序固定为: ​FROMJOINWHEREGROUP BYHAVINGSELECTDISTINCTORDER BYLIMIT​ 掌握该顺序可避免逻辑错误(如别名/聚合函数误用),并提升查询性能。建议通过EXPLAIN命令进一步分析具体数据库的执行计划优化细节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tsxchen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值