SQL执行顺序与ON vs WHERE:MySQL底层解析与面试记忆法
SQL是数据库的"语言",但你有没有想过一句SQL语句是怎么被执行的?尤其在面试中,"SQL执行顺序"以及"ON
和WHERE
的区别"几乎是必考题。这篇博客会用小白能懂的方式,基于MySQL的底层原理,拆解SQL的执行顺序,分析ON
和WHERE
的差异,最后教你怎么记住这些,轻松应对面试!
SQL执行顺序:从写到跑的真相
我们写SQL时是这样的顺序:
sql
SELECT column1, column2
FROM table1
JOIN table2
ON condition
WHERE condition
GROUP BY column
HAVING condition
ORDER BY column;
但MySQL执行时完全不一样!它的底层逻辑是"先准备数据,再加工输出"。下面是真实的执行顺序:
1. FROM 和 JOIN
- 做什么 : 确定数据来源,把表找出来。如果有
JOIN
,先把多个表"拼"在一起。 - 底层原理: MySQL从存储引擎(比如InnoDB)读取表数据,生成一个"虚拟表"(中间结果)。
- 例子 :
FROM users JOIN orders
→ 找到users
和orders
表,准备拼接。
2. ON
- 做什么 : 在
JOIN
时,过滤哪些行可以拼在一起。 - 底层原理 : 对每对行检查
ON
条件,符合的留下,不符合的扔掉,形成初步的"连接结果"。 - 例子 :
ON users.id = orders.user_id
→ 只保留ID匹配的行。
3. WHERE
- 做什么: 从连接后的结果里,再次过滤行。
- 底层原理 : 对虚拟表逐行检查
WHERE
条件,留下符合的行。 - 例子 :
WHERE orders.amount > 100
→ 只保留订单金额大于100的行。
4. GROUP BY
- 做什么: 把数据按某列分组。
- 底层原理: MySQL用哈希表或排序,把相同值的行归堆。
- 例子 :
GROUP BY users.city
→ 按城市分组。
5. HAVING
- 做什么: 过滤分组后的结果。
- 底层原理 : 对分组数据检查
HAVING
条件,留下符合的组。 - 例子 :
HAVING COUNT(*) > 2
→ 只保留订单数超2的组。
6. SELECT
- 做什么: 挑选要输出的列。
- 底层原理 : 从过滤后的虚拟表提取指定列,可能涉及计算(比如
SUM
)。 - 例子 :
SELECT users.name, SUM(orders.amount)
→ 取出名字和总金额。
7. ORDER BY
- 做什么: 对结果排序。
- 底层原理: 用排序算法(比如快速排序)按指定列排好。
- 例子 :
ORDER BY orders.date
→ 按日期排序。
执行顺序总结
FROM → JOIN → ON → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
ON vs WHERE:有啥不一样?
ON
和WHERE
都像"过滤器",但作用的时机和对象不同。
1. ON
-
作用时机 : 在
JOIN
时,决定哪些行可以连接。 -
对象: 针对两个表连接时的行对。
-
底层原理 : MySQL在生成连接结果(笛卡尔积后)时,逐行检查
ON
,只保留匹配的。比如LEFT JOIN
时,ON
没匹配的行会保留左表部分,右表补NULL。 -
例子 :
sqlSELECT * FROM users LEFT JOIN orders ON users.id = orders.user_id;
- 只连接ID匹配的行,没匹配的订单为空。
2. WHERE
-
作用时机: 连接完成后,过滤整个结果。
-
对象: 针对连接后的虚拟表。
-
底层原理 : MySQL对连接后的每一行检查
WHERE
,不符合的直接剔除,连NULL补的行也能被过滤。 -
例子 :
sqlSELECT * FROM users LEFT JOIN orders ON users.id = orders.user_id WHERE orders.amount > 100;
- 先连接,再扔掉金额≤100的行。
关键差异
- 顺序 :
ON
在WHERE
前执行。 - 范围 :
ON
管连接,WHERE
管最终结果。 - 效果 :
ON
不满足还能保留部分行(比如LEFT JOIN
),WHERE
不满足就全扔。
刷题Tips
- 面试问:"
ON
和WHERE
区别?" 答案是:ON
过滤连接条件,WHERE
过滤最终结果,ON
先跑。
MySQL底层怎么解析SQL?
MySQL拿到SQL后,不是直接跑,而是经过几个步骤:
- 词法分析 : 把SQL拆成单词(
SELECT
、FROM
等)。 - 语法分析: 检查语法对不对,生成解析树。
- 逻辑优化 : 调整执行顺序,比如把
WHERE
条件推到前面减少数据量。 - 物理执行: 按优化后的计划,调用存储引擎取数据,生成结果。
执行顺序是优化后的结果,但大致遵循"先取数据(FROM/JOIN/ON),再过滤(WHERE),最后加工(SELECT/ORDER BY)"。
面试怎么记SQL执行顺序?
面试考这个时,背代码顺序没用,得理解逻辑。试试这两种方法:
方法1:故事法
- 想象你是厨师做菜:
- FROM/JOIN: 去市场买菜(找表)。
- ON: 挑搭配好的食材(连接条件)。
- WHERE: 筛掉不新鲜的(过滤行)。
- GROUP BY: 把菜按类型分堆(分组)。
- HAVING: 扔掉不够多的堆(组过滤)。
- SELECT: 选要炒的菜(挑列)。
- ORDER BY: 按顺序摆盘(排序)。
- 口诀:买菜挑好筛,分堆扔杂选,摆盘端上桌。
方法2:关键词首字母
- F-J-O-W-G-H-S-O: FROM-JOIN-ON-WHERE-GROUP-HAVING-SELECT-ORDER。
- 编个顺口溜:"风卷哦哇哥哈搜哦"(有点怪,但多念几遍就熟了)。
小白Tips
- 多写几句SQL(带
JOIN
和GROUP BY
),想想数据怎么一步步变出来,顺序就刻脑子里了。
小结:SQL执行与面试应对
- 执行顺序: FROM → JOIN → ON → WHERE → GROUP BY → HAVING → SELECT → ORDER BY。
- ON vs WHERE :
ON
管连接,WHERE
管结果,顺序和范围不同。 - 底层原理: MySQL先解析优化,再按顺序取数据、过滤、加工。
- 记忆方法: 用故事或口诀,结合实践,面试不慌。