当前位置:首页 > 问答 > 正文

带你随便看看SQL里那个内连接到底是怎么回事,别太严肃啦

主要参考了多本SQL入门教材和网络教程的通俗讲解部分,SQL必知必会》里的连接章节、W3Schools的SQL JOIN教程,以及一些技术博客的“小白友好型”解读。)

好啦,咱们今天就像逛街一样,溜达着把SQL里的“内连接”给弄明白,别担心,这可不是什么严肃的学术讨论,咱们就用最接地气的方式聊聊。

想象一下,你手里有两张表格,第一张表叫“吃货清单”,里面记录了你和你的朋友们最想吃的东西,表格大概长这样:

吃货清单 | 朋友名字 | 想吃的东西 | | :--- | :--- | | 小明 | 火锅 | | 小红 | 烧烤 | | 小刚 | 冰淇淋 | | 小李 | 披萨 |

第二张表叫“优惠券”,记录了你手里有哪些食物的打折券。

优惠券 | 优惠项目 | 折扣 | | :--- | :--- | | 火锅 | 8折 | | 烧烤 | 7.5折 | | 日料 | 9折 | | 牛排 | 免单 |

你面临一个非常现实的问题:今晚约哪个朋友吃饭最划算? 换句话说,你需要找出那个既在“吃货清单”上(朋友想吃),又在“优惠券”列表里(你正好有券)的食物。

这个过程,其实就是“内连接”在做的事情,它的核心思想超级简单:只把两张表里能匹配上的行找出来,匹配不上的,就统统扔掉不看。

我们来手动模拟一下这个“匹配”过程,你拿着“吃货清单”表,我拿着“优惠券”表。

  • 你念:“小明想吃火锅。” 我赶紧在我的优惠券里找“火锅”,哎!找到了!那好,我们把“小明、火锅”和“火锅、8折”这两行信息组合在一起,形成一条新记录。
  • 你接着念:“小红想吃烧烤。” 我找“烧烤”,也找到了!组合起来:“小红、烧烤”和“烧烤、7.5折”。
  • 你继续:“小刚想吃冰淇淋。” 我开始翻找……冰淇淋……冰淇淋……咦?我的优惠券里没有“冰淇淋”这项,那不好意思,小刚同学,虽然你想吃,但我没券,这次聚餐就先不考虑你了,这条记录不匹配,pass掉。
  • “小李想吃披萨。” 我再找,“披萨”?券里没有,同样,小李的愿望也暂时无法实现,这条记录也不匹配。

那我的优惠券里剩下的“日料”和“牛排”呢?虽然折扣很诱人,但你的“吃货清单”里没有朋友点名想吃它们,所以它们也是“落单”的,不参与这次匹配。

好了,匹配完毕!最终我们得到的结果就是这样:

朋友名字 想吃的东西 优惠项目 折扣
小明 火锅 火锅 8折
小红 烧烤 烧烤 5折

看,这个结果表就是“内连接”的产物,它就像一座桥,只允许两张表都有“通行证”(即匹配的值)的记录通过。

在SQL语言里,我们怎么写这个“内连接”呢?最常见的是用INNER JOIN这个关键字(INNER可以省略,直接写JOIN默认就是内连接),然后用ON来指定匹配的条件,针对上面的例子,SQL语句大概长这样:

SELECT *
FROM 吃货清单
INNER JOIN 优惠券 ON 吃货清单.想吃的东西 = 优惠券.优惠项目;

这条命令的意思就是:从“吃货清单”这张表出发,连接上“优惠券”表,连接的条件是“吃货清单”里的“想吃的东西”这一列,要和“优惠券”里的“优惠项目”这一列相等。

“内连接”真的没什么神秘的,你完全可以把它理解成一次“找共同点”的行动,它只关心两张表之间的“交集”,就像数学里的集合概念一样,只取两者重叠的那部分。

那什么时候会用到内连接呢?太多了!

  • 电商系统里,把“订单表”和“商品表”连接起来,显示每个订单对应的商品详情(只显示已下单的商品)。
  • 学校系统里,把“学生表”和“选课表”连接起来,看看有哪些学生选了某门课(只显示选了课的学生)。
  • 就像我们刚才的例子,找出需求和资源能完美匹配的项目。

内连接就是一个“现实主义者”或者“务实派”,它不关心那些虚无缥缈的可能性(比如有小刚想吃的但你没券的冰淇淋,或者你有券但没人想吃的牛排),它只呈现眼前确凿无疑、能对应上的事实,它帮你从杂乱的数据中,快速聚焦到那些有关联、有意义的信息组合上。

怎么样,溜达了这一圈,是不是觉得内连接也没那么难懂了?它其实就是一种让数据“牵手成功”的小魔法而已!

带你随便看看SQL里那个内连接到底是怎么回事,别太严肃啦