← 返回文章列表
数据库·1301 次阅读

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;
  1. FROM/JOIN:先确定要查哪些表,按 ON 条件拼接
  2. WHERE:对拼接后的行逐行过滤,此时还没有分组,所以不能用聚合函数
  3. GROUP BY:按分类分组
  4. HAVING:对分组后的结果过滤,可以用 COUNT 等聚合
  5. SELECT:最后才决定输出哪些列、计算别名
  6. ORDER BY/LIMIT:排序、截断

常见疑问

为什么 WHERE 里不能写列别名,ORDER BY 里却可以? 因为 WHERE 执行在 SELECT 之前,别名还不存在;ORDER BY 在 SELECT 之后。

WHERE 和 HAVING 的区别?

  • WHERE 过滤行,在分组前执行,能走索引
  • HAVING 过滤组,在聚合后执行,尽量让 WHERE 多过滤、减轻分组压力

COUNT(*)、COUNT(字段)、COUNT(DISTINCT 字段) 三者也不同:COUNT(*) 统计总行数,COUNT(字段) 不统计 NULL。

看到这里了?如果这篇文章帮到过你

请我喝瓶可乐就好 🥤

收款码

评论0 条

还没有评论,来抢沙发~

发表评论

评论需审核后显示

© 2026 许冬博客 · 专注 JS 技术分享

·RSS 订阅·Powered by Nuxt 4