sql执行顺序

复制代码
SELECT DISTINCT
FROM
JOIN
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT/OFFSET

实际执行顺序

顺序 关键字 说明
1 FROM 加载左表数据
2 JOIN 连接右表,生成笛卡尔积/匹配行
3 ON 筛选连接条件(JOIN 的过滤)
4 WHERE 逐行过滤数据(不能使用聚合函数)
5 GROUP BY 分组聚合
6 HAVING 过滤分组后的数据(可以使用聚合函数)
7 SELECT 选择列、计算表达式、去重
8 DISTINCT 去重
9 ORDER BY 排序
10 LIMIT/OFFSET 限制返回行数

关键理解示例

复制代码
SELECT 
    dept_id,
    AVG(salary) as avg_salary
FROM employees e
JOIN departments d ON e.dept_id = d.id
WHERE e.status = 'active'      -- 第4步执行,过滤原始行
GROUP BY dept_id                -- 第5步执行
HAVING AVG(salary) > 50000      -- 第6步执行,过滤分组
ORDER BY avg_salary DESC        -- 第9步执行
LIMIT 10;      -- 第10步执行

注意事项

  1. WHERE 不能使用聚合函数(如 SUM(), AVG()),要用 HAVING

  2. 别名 在 SELECT 阶段才生成,所以 WHERE 中不能用别名,ORDER BY 中可以

  3. 执行顺序是逻辑顺序,数据库优化器可能会重排以提高性能,但结果等价

相关推荐
风向决定发型丶2 小时前
redis集群搭建
数据库·redis·缓存
wei_shuo4 小时前
KES 扩展与插件开发实战:自定义函数、触发器与第三方插件集成
数据库·kes
风中芦苇啊5 小时前
从直接生成到受控配置:新一代图表Agent的SQL安全生成范式
数据库·sql·安全
吴声子夜歌5 小时前
SQL进阶——窗口函数
数据库·sql
周杰伦的稻香5 小时前
MySQL8.0+中引入的SET_USER_ID权限迭代SUPER权限指定 DEFINER
数据库·mysql
动恰客流统计5 小时前
客流统计如何结合AI分析?从传统计数到智能决策的技术升级路径
数据库·人工智能·边缘计算
宠友信息6 小时前
多端数据互通场景下Spring Boot仿小红书源码结构设计
数据库·spring boot·redis·缓存·架构
风曦Kisaki6 小时前
#Linux数据库管理Day06:主从同步与MaxScale读写分离
linux·运维·数据库
影寂ldy7 小时前
C# try-catch 异常处理全套笔记
服务器·数据库·c#
长不胖的路人甲7 小时前
Redis 缓存的数据持久化方案讲解
数据库·redis·缓存