Skip to content

什么是 内连接、外连接、交叉连接、笛卡尔积

cxuan edited this page Jun 22, 2020 · 1 revision

连接的方式主要有三种:外连接、内链接、交叉连接

  • 外连接(OUTER JOIN):外连接分为三种,分别是左外连接(LEFT OUTER JOIN 或 LEFT JOIN)右外连接(RIGHT OUTER JOIN 或 RIGHT JOIN)全外连接(FULL OUTER JOIN 或 FULL JOIN)

    左外连接:又称为左连接,这种连接方式会显示左表不符合条件的数据行,右边不符合条件的数据行直接显示 NULL

右外连接:也被称为右连接,他与左连接相对,这种连接方式会显示右表不符合条件的数据行,左表不符合条件的数据行直接显示 NULL

MySQL 暂不支持全外连接

  • 内连接(INNER JOIN):结合两个表中相同的字段,返回关联字段相符的记录。

  • 笛卡尔积(Cartesian product): 我在上面提到了笛卡尔积,为了方便,下面再列出来一下。

现在我们有两个集合 A = {0,1} , B = {2,3,4}

那么,集合 A * B 得到的结果就是

A * B = {(0,2)、(1,2)、(0,3)、(1,3)、(0,4)、(1,4)};

B * A = {(2,0)、{2,1}、{3,0}、{3,1}、{4,0}、(4,1)};

上面 A * B 和 B * A 的结果就可以称为两个集合相乘的 笛卡尔积

我们可以得出结论,A 集合和 B 集合相乘,包含了集合 A 中的元素和集合 B 中元素之和,也就是 A 元素的个数 * B 元素的个数

  • 交叉连接的原文是Cross join ,就是笛卡尔积在 SQL 中的实现,SQL中使用关键字CROSS JOIN来表示交叉连接,在交叉连接中,随便增加一个表的字段,都会对结果造成很大的影响。

    SELECT * FROM t_Class a CROSS JOIN t_Student b WHERE a.classid=b.classid

    或者不用 CROSS JOIN,直接用 FROM 也能表示交叉连接的效果

    SELECT * FROM t_Class a ,t_Student b WHERE a.classid=b.classid

    如果表中字段比较多,不适宜用交叉连接,交叉连接的效率比较差。

  • 全连接:全连接也就是 full join,MySQL 中不支持全连接,但是可以使用其他连接查询来模拟全连接,可以使用 UNIONUNION ALL 进行模拟。例如

    (select colum1,colum2...columN from tableA ) union (select colum1,colum2...columN from tableB )
    
    
    或 
    (select colum1,colum2...columN from tableA ) union all (select colum1,colum2...columN from tableB );

    使用 UNION 和 UNION ALL 的注意事项

    通过 union 连接的 SQL 分别单独取出的列数必须相同

    使用 union 时,多个相等的行将会被合并,由于合并比较耗时,一般不直接使用 union 进行合并,而是通常采用 union all 进行合并

Clone this wiki locally