本章主要介绍一些数据库连接相关方面的内容:
-
内联接(INNER JOIN)
-
左联接(LEFT JOIN)
-
右联接(RIGHT JOIN)
-
全外联接(FULL OUTER JOIN)
1. SQL联接
SQL包含各种连接,从大的种类上来说可以分为:
下面给出各种连接的韦恩图
:
为了讲解下面的各种联接,我们先定义如下student
表与course
表:
2. 内联接
内联接是一种一一映射
关系,就是两张表都有的才显示出来。用韦恩图表示是两个集合的交集:
其中内联接又可以细分成如下三种:
-
等值联接: 在连接条件中使用等于运算符(=)比较被联接列的列值,其查询结果中列出被联接表中的所有列,包括其中的重复列
-
不等值联接: 在连接条件中使用除等号运算符以外的其他比较运算符比较被连接列的列值,这些运算符包括>,>=,<=,<,!>,!<
,和<>
-
自然联接: 在连接条件中使用等于运算符(=)比较被连接的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除联接表中的重复列。注意,自然联接要求外键名称(foreign key)与所指向的表的主键名称(primary key)必须相同,且nature join会合并相同的列
参看如下示例:
2. 外联接
外联接主要包括:
2.1 左外联接
左外联接的结果包括LEFT OUTER
子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配,则在相关联的结果集中右表的所有选择列均为NULL。下面给出左外连接韦恩图
:
参看如下示例:
2.2 右外联接
右外联接是左外联接的反向联接,将返回右表的所有行。如果右表的某行在左表中没有匹配的行,则将左表返回空值。下面给出右外联接韦恩图
:
2.3 全联接
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列包含空值。如果表之间有匹配行,则整个结果集包含基表的数据值。下面给出全联接的韦恩图
:
参看如下示例:
这里注意到MySQL并不支持全联接,这里我们只能用如下的代码进行模拟:
2.4 左外联接不包含内联接
这是LEFT JOIN EXCLUDING INNER JOIN
:这个查询是只查询左边表有的数据,共同有的也不查出来。用韦恩图
表示如下:
参看如下示例:
2.5 右外联接不包含内联接
这是RIGHT JOIN EXCLUDING INNER JOIN
: 这个查询是只查询右边表有的数据,共同有的也不查出来。用韦恩图
表示如下:
参看如下示例:
2.6 外联接不包含内联接
这是OUTER JOIN EXCLUDING INNER JOIN
: 意思就是查询左右表各自拥有的那部分数据。用韦恩图
表示如下:
参看如下示例:
这里由于MySQL不支持FULL JOIN,因此我们通过如下代码进行模拟:
3. 交叉联接
交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接又被称为笛卡尔积。参看如下示例:
[参看]:
-
MySQL教程
-
数据库左连接、右连接、内连接、全连接笔记
-
深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接
-
Visual Representation of SQL Joins
-
SQL的几种连接:内连接、左联接、右连接、全连接、交叉连接