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先解析优化,再按顺序取数据、过滤、加工。
  • 记忆方法: 用故事或口诀,结合实践,面试不慌。
相关推荐
柏油5 小时前
MySQL InnoDB 行锁
数据库·后端·mysql
咖啡调调。5 小时前
使用Django框架表单
后端·python·django
白泽talk5 小时前
2个小时1w字| React & Golang 全栈微服务实战
前端·后端·微服务
摆烂工程师5 小时前
全网最详细的5分钟快速申请一个国际 “edu教育邮箱” 的保姆级教程!
前端·后端·程序员
一只叫煤球的猫5 小时前
你真的会用 return 吗?—— 11个值得借鉴的 return 写法
java·后端·代码规范
Asthenia04125 小时前
HTTP调用超时与重试问题分析
后端
颇有几分姿色6 小时前
Spring Boot 读取配置文件的几种方式
java·spring boot·后端
AntBlack6 小时前
别说了别说了 ,Trae 已经在不停优化迭代了
前端·人工智能·后端
@淡 定6 小时前
Spring Boot 的配置加载顺序
java·spring boot·后端