SQL执行顺序与ON vs WHERE:MySQL底层解析与面试记忆法

27 阅读5分钟

SQL执行顺序与ON vs WHERE:MySQL底层解析与面试记忆法

SQL是数据库的“语言”,但你有没有想过一句SQL语句是怎么被执行的?尤其在面试中,“SQL执行顺序”以及“ONWHERE的区别”几乎是必考题。这篇博客会用小白能懂的方式,基于MySQL的底层原理,拆解SQL的执行顺序,分析ONWHERE的差异,最后教你怎么记住这些,轻松应对面试!


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 → 找到usersorders表,准备拼接。

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:有啥不一样?

ONWHERE都像“过滤器”,但作用的时机和对象不同。

1. ON

  • 作用时机: 在JOIN时,决定哪些行可以连接。
  • 对象: 针对两个表连接时的行对。
  • 底层原理: MySQL在生成连接结果(笛卡尔积后)时,逐行检查ON,只保留匹配的。比如LEFT JOIN时,ON没匹配的行会保留左表部分,右表补NULL。
  • 例子:
    SELECT * FROM users LEFT JOIN orders ON users.id = orders.user_id;
    
    • 只连接ID匹配的行,没匹配的订单为空。

2. WHERE

  • 作用时机: 连接完成后,过滤整个结果。
  • 对象: 针对连接后的虚拟表。
  • 底层原理: MySQL对连接后的每一行检查WHERE,不符合的直接剔除,连NULL补的行也能被过滤。
  • 例子:
    SELECT * FROM users LEFT JOIN orders ON users.id = orders.user_id WHERE orders.amount > 100;
    
    • 先连接,再扔掉金额≤100的行。

关键差异

  • 顺序: ONWHERE前执行。
  • 范围: ON管连接,WHERE管最终结果。
  • 效果: ON不满足还能保留部分行(比如LEFT JOIN),WHERE不满足就全扔。

刷题Tips

  • 面试问:“ONWHERE区别?” 答案是:ON过滤连接条件,WHERE过滤最终结果,ON先跑。

MySQL底层怎么解析SQL?

MySQL拿到SQL后,不是直接跑,而是经过几个步骤:

  1. 词法分析: 把SQL拆成单词(SELECTFROM等)。
  2. 语法分析: 检查语法对不对,生成解析树。
  3. 逻辑优化: 调整执行顺序,比如把WHERE条件推到前面减少数据量。
  4. 物理执行: 按优化后的计划,调用存储引擎取数据,生成结果。

执行顺序是优化后的结果,但大致遵循“先取数据(FROM/JOIN/ON),再过滤(WHERE),最后加工(SELECT/ORDER BY)”。


面试怎么记SQL执行顺序?

面试考这个时,背代码顺序没用,得理解逻辑。试试这两种方法:

方法1:故事法

  • 想象你是厨师做菜:
    1. FROM/JOIN: 去市场买菜(找表)。
    2. ON: 挑搭配好的食材(连接条件)。
    3. WHERE: 筛掉不新鲜的(过滤行)。
    4. GROUP BY: 把菜按类型分堆(分组)。
    5. HAVING: 扔掉不够多的堆(组过滤)。
    6. SELECT: 选要炒的菜(挑列)。
    7. ORDER BY: 按顺序摆盘(排序)。
  • 口诀:买菜挑好筛,分堆扔杂选,摆盘端上桌。

方法2:关键词首字母

  • F-J-O-W-G-H-S-O: FROM-JOIN-ON-WHERE-GROUP-HAVING-SELECT-ORDER。
  • 编个顺口溜:“风卷哦哇哥哈搜哦”(有点怪,但多念几遍就熟了)。

小白Tips

  • 多写几句SQL(带JOINGROUP BY),想想数据怎么一步步变出来,顺序就刻脑子里了。

小结:SQL执行与面试应对

  • 执行顺序: FROM → JOIN → ON → WHERE → GROUP BY → HAVING → SELECT → ORDER BY。
  • ON vs WHERE: ON管连接,WHERE管结果,顺序和范围不同。
  • 底层原理: MySQL先解析优化,再按顺序取数据、过滤、加工。
  • 记忆方法: 用故事或口诀,结合实践,面试不慌。