学习笔记之 MySQL 学习第二部分——连接和笛卡尔积

231 阅读6分钟

MySQL连接

如果需要从多张表中进行数据操作,则需要使用到多表连接。
MySQL中使用关键字 JOIN 进行多表连接操作 JOIN连接有三种形式,分别为:

  • INNER JOIN:内连接或等值链接。获取两个表中字段匹配关系的记录。
  • LEFT JOIN:左连接。获取左表所有记录,即使右表中没有对应的匹配记录。
  • RIGHT JOIN:右连接。与 LEFT JOIN 相反,获取右表中的所有记录,即使左表中没有对应的匹配记录。

INNER JOIN(内连接)

  • 作用
    • 内连接用于返回两个或多个表中满足连接条件的行。它会根据指定的连接条件,将两个表中相关的行组合在一起,只返回在连接条件上匹配的行。
  • 原理
    • 内连接会对两个表进行笛卡尔积运算(将第一个表中的每一行与第二个表中的每一行进行组合),然后根据连接条件筛选出符合条件的行组合。从本质上说,它是在两个表之间建立了一个逻辑关联,只保留关联成功的记录。

LEFT JOIN(左连接)

  • 作用
    • 左连接返回左表(在“FROM”子句中指定的第一个表)中的所有行,以及右表中与左表连接条件匹配的行。如果右表中没有匹配的行,则返回NULL值。
  • 原理
    • 左连接首先会选择左表中的所有行,然后对于左表中的每一行,它会在右表中查找符合连接条件的行。如果找到匹配的行,就将它们组合在一起;如果没有找到匹配的行,就用NULL值填充右表中的列,然后将左表的行和这些带有NULL值的行组合返回。

RIGHT JOIN(右连接)

  • 作用
    • 右连接返回右表(在“JOIN”关键字右侧的表)中的所有行,以及左表中与右表连接条件匹配的行。如果左表中没有匹配的行,则返回NULL值。
  • 原理
    • 右连接的过程和左连接类似,只是方向相反。它首先会选择右表中的所有行,然后对于右表中的每一行,在左表中查找符合连接条件的行。如果找到匹配的行,就组合在一起;如果没有找到,就用NULL值填充左表中的列,最后将右表的行和这些带有NULL值的行组合返回。

区别总结

  • 返回结果集的范围
    • 内连接只返回两个表中连接条件匹配的行。
    • 左连接返回左表的所有行以及右表中匹配的行,右表中没有匹配的行则用NULL填充。
    • 右连接返回右表的所有行以及左表中匹配的行,左表中没有匹配的行则用NULL填充。
  • 使用场景
    • 当只需要获取两个表中相互关联的数据时,使用内连接。例如,查询有订单的客户和他们的订单详细信息。
    • 当需要获取一个表的全部数据以及另一个表与之关联的数据(如果有的话),根据具体情况选择左连接或右连接。比如,要查询所有客户信息和他们的订单信息(包括没有订单的客户),使用左连接;要查询所有订单信息和对应的产品信息(包括没有产品记录的订单),使用右连接。

笛卡尔积

定义

  • 笛卡尔积是在数学中,特别是集合论中的一个概念。在关系型数据库(如MySQL)中也会涉及到这个概念。对于两个集合A和B,它们的笛卡尔积是所有可能的有序对(a, b)的集合,其中a属于集合A,b属于集合B。简单来说,如果集合A有m个元素,集合B有n个元素,那么A和B的笛卡尔积就有m×n个元素。

示例

  • 假设集合A = {1, 2},集合B = {a, b, c}。那么A和B的笛卡尔积A×B ={(1, a), (1, b), (1, c), (2, a), (2, b), (2, c)}。可以看到,集合A中的每个元素都与集合B中的每个元素进行了组合,形成了新的有序对。

在数据库中的应用(以表连接为例)

  • 在数据库的表连接操作(如内连接、外连接等操作的底层部分)中,笛卡尔积是一个基础概念。当执行两个表的连接操作时,数据库系统首先会计算两个表的笛卡尔积。
  • 例如,有一个“学生”表(包含学生ID、学生姓名),有3个学生记录,和一个“课程”表(包含课程ID、课程名称),有4门课程记录。在没有指定连接条件时,这两个表的笛卡尔积会产生3×4 = 12条记录。这些记录是将“学生”表中的每一个学生记录与“课程”表中的每一个课程记录进行组合得到的。但在实际应用中,这种没有条件限制的笛卡尔积通常不是我们想要的最终结果,因为它包含了很多没有实际意义的组合。所以通常会通过连接条件(如学生所选课程的关联字段)来筛选出有意义的记录组合,这就是各种表连接操作(如内连接、左连接等)在笛卡尔积基础上进行的进一步筛选过程。

笛卡尔积的计算方式(从数学角度)

  • 如果有多个集合A₁, A₂, …, Aₙ,它们的笛卡尔积A₁×A₂×…×Aₙ是所有可能的n元组(a₁, a₂, …, aₙ)的集合,其中aᵢ属于集合Aᵢ(i = 1,2, …, n)。计算笛卡尔积的过程可以通过嵌套循环来实现。以两个集合为例,假设有集合A和B,计算A×B可以用以下伪代码表示:
foreach element a in A:
    foreach element b in B:
        add the ordered pair (a, b) to the result set 
  • 在数据库中,数据库管理系统在执行表连接操作的初始阶段,也会类似地进行这种组合操作,只是具体的实现细节是在数据库的内部引擎中完成的。

每次面试的时候,都会被问一堆数据库的问题。而每次被问到内连接的时候,我都会说:“使用内连接会返回两张表的笛卡尔积集合结果”,但是其实我内心是不明白笛卡尔积到底是怎么回事的,内心慌得一批,这回知道了啊,下次就不慌了