MySQL 入门:一条 SELECT 的执行顺序
MySQL 入门:一条 SELECT 的执行顺序
学 SQL 最容易迷糊的是各子句的先后,先记住逻辑执行顺序(不是书写顺序):
FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT
一条查询走一遍
SELECT c.name, COUNT(p.id) AS post_count
FROM categories c
LEFT JOIN posts p ON p.category_id = c.id
WHERE p.status = 'PUBLISHED'
GROUP BY c.name
HAVING post_count > 0
ORDER BY post_count DESC
LIMIT 10;
- FROM/JOIN:先确定要查哪些表,按 ON 条件拼接
- WHERE:对拼接后的行逐行过滤,此时还没有分组,所以不能用聚合函数
- GROUP BY:按分类分组
- HAVING:对分组后的结果过滤,可以用
COUNT等聚合 - SELECT:最后才决定输出哪些列、计算别名
- ORDER BY/LIMIT:排序、截断
常见疑问
为什么 WHERE 里不能写列别名,ORDER BY 里却可以? 因为 WHERE 执行在 SELECT 之前,别名还不存在;ORDER BY 在 SELECT 之后。
WHERE 和 HAVING 的区别?
- WHERE 过滤行,在分组前执行,能走索引
- HAVING 过滤组,在聚合后执行,尽量让 WHERE 多过滤、减轻分组压力
COUNT(*)、COUNT(字段)、COUNT(DISTINCT 字段) 三者也不同:COUNT(*) 统计总行数,COUNT(字段) 不统计 NULL。
看到这里了?如果这篇文章帮到过你
请我喝瓶可乐就好 🥤

评论0 条
还没有评论,来抢沙发~