原始表
↓
FROM (获取数据源)
↓
ON (筛选连接前的行)
↓
JOIN (生成连接表)
↓
WHERE (过滤行)
↓
GROUP BY (分组)
↓
HAVING (过滤分组)
↓
SELECT (计算列、聚合、别名)
↓
DISTINCT (去重)
↓
ORDER BY (排序)
↓
LIMIT (限制行数)
↓
最终结果
FROM – 确定数据源表
ON – 筛选连接前的行(对 JOIN 而言)
JOIN – 执行连接操作,生成虚拟表
WHERE – 对连接后的行进行过滤
GROUP BY – 将行分组
HAVING – 对分组后的结果进行过滤
SELECT – 选择列、计算表达式、聚合函数
DISTINCT – 去除重复行
ORDER BY – 排序
LIMIT / OFFSET – 限制返回行数
注意:ON 只对 JOIN 有效,WHERE 则在连接完成后整体过滤。SELECT 中的列别名通常无法在 WHERE / GROUP BY / HAVING 中使用,因为它们在 SELECT 之后才生成。
WHERE和ON区别:ON 的过滤发生在连接前,而 WHERE 发生在连接后。
WHERE 和 HAVING 的区别:
WHERE 过滤行,在分组前;HAVING 过滤分组,在 GROUP BY 后,可使用聚合函数。