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

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

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


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 → 找到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。

  • 例子 :

    sql 复制代码
    SELECT * FROM users LEFT JOIN orders ON users.id = orders.user_id;
    • 只连接ID匹配的行,没匹配的订单为空。

2. WHERE

  • 作用时机: 连接完成后,过滤整个结果。

  • 对象: 针对连接后的虚拟表。

  • 底层原理 : MySQL对连接后的每一行检查WHERE,不符合的直接剔除,连NULL补的行也能被过滤。

  • 例子 :

    sql 复制代码
    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先解析优化,再按顺序取数据、过滤、加工。
  • 记忆方法: 用故事或口诀,结合实践,面试不慌。
相关推荐
uhakadotcom22 分钟前
Thrift2: HBase 多语言访问的利器
后端·面试·github
Asthenia041223 分钟前
Java 类加载规则深度解析:从双亲委派到 JDBC 与 Tomcat 的突破
后端
方圆想当图灵34 分钟前
从 Java 到 Go:面向对象的巨人与云原生的轻骑兵
后端·代码规范
Moment34 分钟前
一份没有项目展示的简历,是怎样在面试里输掉的?开源项目或许是你的救命稻草 😭😭😭
前端·后端·面试
Asthenia041244 分钟前
JavaSE Stream 是否线程安全?并行流又是什么?
后端
半部论语1 小时前
SpringMVC 中的DispatcherServlet生命周期是否受Spring IOC 容器管理
java·后端·spring
Asthenia04121 小时前
JavaSE-常见排序:Arrays/Collections/List/StreamAPI
后端
Asthenia04121 小时前
深入浅出分析JDK动态代理与CGLIB动态代理的区别
后端
追逐时光者2 小时前
C#/.NET/.NET Core技术前沿周刊 | 第 32 期(2025年3.24-3.31)
后端·.net
uhakadotcom2 小时前
轻松掌握XXL-JOB:分布式任务调度的利器
后端·面试·github