大家好呀,我是小米,一个31岁还在写代码的程序员。说实话,最近面试的时候被问到一个问题,差点让我当场愣住。面试官问:“小米,你能说说MySQL里有哪些关联查询吗?”

当时我心里咯噔一下,第一反应是“内连接、外连接”,但这只是最基础的,面试官显然不满足于这种“背书式回答”,他要的是我能把底层逻辑、应用场景,甚至SQL写法都能清楚说出来。

于是,今天这篇文章就想和大家聊聊:MySQL有哪些常见的关联查询?它们的原理、区别和应用场景是什么?

我会把这次面试的经历、我踩过的坑,以及后来复盘整理的知识,讲成一个小故事。

初遇面试官:关联查询是啥?

面试那天,面试官看着简历,笑着问我:“小米,你做项目的时候,表和表之间是不是经常需要做关联?”

我点点头:“对啊,我们的业务表很多,订单表要关联用户表,用户表又要关联地址表,三四个表一联动,SQL就写得花里胡哨的。”

“那你能说说,MySQL里的关联查询有哪些吗?”

我当时立马回答:“有内连接、左连接、右连接,还有全连接。”

面试官抬头笑了笑,接着问:“全连接?MySQL真的有吗?”

我当场哑火。对啊,MySQL其实没有直接支持 FULL JOIN,要么自己写 UNION,要么变通实现。

尴尬的空气弥漫了几秒钟,我赶紧把话题拉回:“其实除了这些,还可以用交叉连接、自连接……”

后来想想,这一幕真的是提醒我:面试不仅是考知识点,更是考你能不能把知识用业务化的语言讲清楚。

第一类:内连接(INNER JOIN)

面试官听完我的回答,点点头:“那好,先说说内连接吧。”

内连接的核心是:取出两张表中符合条件的记录

比如,有用户表 user 和订单表 order,我要查下单的用户,SQL是这样的:

我在面试中被问懵了:MySQL JOIN 有哪几种?_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

但我们可以模拟:

我在面试中被问懵了:MySQL JOIN 有哪几种?_内连接_02

这样就能查出“所有用户 + 所有订单”的全集结果。

这个SQL写起来有点冗长,但有时候数据分析确实需要。

第五类:交叉连接(CROSS JOIN)

交叉连接就是数学里的笛卡尔积

比如:

我在面试中被问懵了:MySQL JOIN 有哪几种?_SQL_03

这会生成用户和商品的所有组合,100个用户 × 50个商品 = 5000 条数据。

面试官听到这里点点头,说:“那这种场景一般会在哪用呢?”

我答:“在电商推荐里挺常见的,比如先生成所有用户和商品的组合,再通过算法打分筛选出候选推荐列表。”

虽然实际中不会直接这么查,但这个思路确实存在。

第六类:自连接(SELF JOIN)

我接着说:“还有一种比较有意思的——自连接。”

举个例子:部门表里,每个员工有一个上级 ID。

我在面试中被问懵了:MySQL JOIN 有哪几种?_MySQL_04

这就是表和自己做关联。

它的核心思想是:一张表同时扮演两个角色,就像一个演员既演儿子又演父亲。

在组织架构、树形结构的数据里,自连接用得特别多。

第七类:自然连接(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岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!