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. 执行顺序是逻辑顺序,数据库优化器可能会重排以提高性能,但结果等价

相关推荐
imDwAaY43 分钟前
MySQL 存储引擎是什么?
android·数据库·mysql
星云低代码开发平台1 小时前
ERP 与 CRM 客户信用核对:业务键、时点和权限验收
大数据·数据库·人工智能
xiaogai_gai1 小时前
销售出库单同步实战:旺店通→金蝶云星空的单一策略深度拆解
大数据·前端·数据库
下页、再停留1 小时前
【C#桌面客户端系列学习-11】将SQLite数据库打包到exe里
数据库·c#·visual studio
下页、再停留1 小时前
【C#桌面客户端系列学习-12】封装SQLite数据库基础操作工具类(CURD)
数据库·c#·visual studio
LYmatch1 小时前
2024年408真题第41~47题汇总解析
数据库
程序员Sunday1 小时前
Redis 缓存穿透、击穿、雪崩怎么区分?从回源压力找原因
数据库·redis·缓存
我科绝伦(Huanhuan Zhou)1 小时前
磐维数据库(PanWeiDB)日常运维命令总结
运维·数据库
guo_wen_qiang1 小时前
redis实现秒杀功能-超卖&库存遗留问题的解决
数据库·redis·缓存
逐流人1 小时前
Redis内存数据库:从数据类型到集群部署
linux·运维·数据库·redis·缓存·云计算