大家好呀,我是小米,一个31岁还在写代码的程序员。说实话,最近面试的时候被问到一个问题,差点让我当场愣住。面试官问:“小米,你能说说MySQL里有哪些关联查询吗?”
当时我心里咯噔一下,第一反应是“内连接、外连接”,但这只是最基础的,面试官显然不满足于这种“背书式回答”,他要的是我能把底层逻辑、应用场景,甚至SQL写法都能清楚说出来。
于是,今天这篇文章就想和大家聊聊:MySQL有哪些常见的关联查询?它们的原理、区别和应用场景是什么?
我会把这次面试的经历、我踩过的坑,以及后来复盘整理的知识,讲成一个小故事。
初遇面试官:关联查询是啥?
面试那天,面试官看着简历,笑着问我:“小米,你做项目的时候,表和表之间是不是经常需要做关联?”
我点点头:“对啊,我们的业务表很多,订单表要关联用户表,用户表又要关联地址表,三四个表一联动,SQL就写得花里胡哨的。”
“那你能说说,MySQL里的关联查询有哪些吗?”
我当时立马回答:“有内连接、左连接、右连接,还有全连接。”
面试官抬头笑了笑,接着问:“全连接?MySQL真的有吗?”
我当场哑火。对啊,MySQL其实没有直接支持 FULL JOIN,要么自己写 UNION,要么变通实现。
尴尬的空气弥漫了几秒钟,我赶紧把话题拉回:“其实除了这些,还可以用交叉连接、自连接……”
后来想想,这一幕真的是提醒我:面试不仅是考知识点,更是考你能不能把知识用业务化的语言讲清楚。
第一类:内连接(INNER JOIN)
面试官听完我的回答,点点头:“那好,先说说内连接吧。”
内连接的核心是:取出两张表中符合条件的记录。
比如,有用户表 user 和订单表 order,我要查下单的用户,SQL是这样的:

这时,只有那些在 order 表里有下过单的用户才会被查出来。
所以内连接其实有点像“朋友圈的双向好友”——只有你们俩互相关注,才能在列表里看到。
我告诉面试官:“在业务里,内连接最常用,尤其是要取交集的时候,直接上 INNER JOIN。”
他点点头,继续追问:“那如果有个用户没下单呢?”
我笑了:“那就得用左连接了。”
第二类:左连接(LEFT JOIN)
左连接是我的老朋友了,它的逻辑是:以左表为基准,右表能对上就显示,对不上就显示 NULL。
还是上面的例子,如果我想查所有用户和他们的订单情况:
这时候,哪怕用户没下单,他的信息也会显示出来,只是订单号是 NULL。
就像朋友圈的“单向好友”,左表的人一定会出现在结果里,右表没有匹配上,就空着。
这在业务里非常有用,比如要查“哪些用户是零下单的潜在客户”,就可以直接用 WHERE o.order_no IS NULL 搞定。
第三类:右连接(RIGHT JOIN)
右连接其实和左连接对称:以右表为基准。
不过我自己工作中用得少,因为表的顺序完全可以换过来再用 LEFT JOIN 实现。
但有时候遇到一些业务方写的历史SQL,可能会看到 RIGHT JOIN,所以知道它的用法就好。
第四类:全连接(FULL JOIN)
当时我说到“全连接”的时候,面试官笑了一下:“MySQL有吗?”
我才反应过来:MySQL其实不支持 FULL JOIN。
但我们可以模拟:

这样就能查出“所有用户 + 所有订单”的全集结果。
这个SQL写起来有点冗长,但有时候数据分析确实需要。
第五类:交叉连接(CROSS JOIN)
交叉连接就是数学里的笛卡尔积。
比如:

这会生成用户和商品的所有组合,100个用户 × 50个商品 = 5000 条数据。
面试官听到这里点点头,说:“那这种场景一般会在哪用呢?”
我答:“在电商推荐里挺常见的,比如先生成所有用户和商品的组合,再通过算法打分筛选出候选推荐列表。”
虽然实际中不会直接这么查,但这个思路确实存在。
第六类:自连接(SELF JOIN)
我接着说:“还有一种比较有意思的——自连接。”
举个例子:部门表里,每个员工有一个上级 ID。

这就是表和自己做关联。
它的核心思想是:一张表同时扮演两个角色,就像一个演员既演儿子又演父亲。
在组织架构、树形结构的数据里,自连接用得特别多。
第七类:自然连接(NATURAL JOIN)
自然连接算是个小众选手,它会自动根据两张表里相同字段名来做关联。
听起来挺方便,但其实在业务里很少用。因为你无法控制到底是哪些字段在关联,一旦表结构变了,SQL结果可能也跟着变,所以大厂一般不推荐。
面试官的最后一句话
讲到这里,面试官合上笔记本,笑着说:“小米,你说得还不错。不过我想听到的不只是分类,更希望你能结合场景去解释,比如用户和订单、员工和上级,这样才说明你懂业务,而不仅仅是记住了概念。”
那一刻我心里一暖。原来,技术面试并不是要你死记硬背,而是要看你能不能把知识点和实际业务连接起来。
复盘:MySQL关联查询的全景图
最后我自己整理了一张小思维导图,方便记忆:
- INNER JOIN:取交集
- LEFT JOIN:左表全出,右表能对上就对上
- RIGHT JOIN:右表全出,左表能对上就对上
- FULL JOIN:MySQL不支持,用 UNION 模拟
- CROSS JOIN:笛卡尔积
- SELF JOIN:同一张表,分身两角
- NATURAL JOIN:自动匹配相同字段(不常用)
写在最后
这次面试让我想起一句话:
SQL 本质上是一门“描述关系”的语言,JOIN 就是我们用来表达关系的工具。
有些人写SQL只追求“能跑出来结果”,但如果能真正理解各种 JOIN 的逻辑和应用场景,不仅能在面试里加分,还能在实际工作中写出更高效、更优雅的SQL。
所以,下次再被问到“你能说说MySQL有哪些关联查询吗?”,我会笑着回答:“当然能,而且我还可以告诉你它们在业务里是怎么落地的。”
END
以上就是我今天的分享啦,如果你正在准备面试,不妨把这几个 JOIN 背后的逻辑吃透。相信你在面试中一定能自信应对。
我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!
174万+

被折叠的 条评论
为什么被折叠?



