交叉连接、内连接和外连接是数据库中用于连接表的三种不同操作。
连接方式 | 描述 | |
---|---|---|
交叉连接 (CROSS JOIN) | 不使用任何条件,直接将一个表的所有记录和另一个表中的所有记录一一匹配 | |
内连接 (INNER JOIN) | 根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现在结果集中。 | |
外连接 (OUTER JOIN) | 结果集中不仅包含符合连接条件的行,还可能包含左表、右表或两个表中的所有数据行。分为左外连接 (LEFT JOIN)、右外连接 (RIGHT JOIN) 和全外连接 (FULL JOIN)。 |
一、交叉连接(CROSS JOIN)是内连接的一种特例,不带查询条件。它简单地将两个表的所有记录相互匹配,生成的结果集是两个表的笛卡尔积。(假设A、B两个集合) 用a*b,a∈A,b∈B。
示例:假设有两个表TableA和TableB,表结构如下:
表名 | 列名 | 数据类型 |
---|---|---|
TableA | ID | INT |
TableB | Name | VARCHAR(50) |
使用交叉连接将这两个表连接起来:
SELECT *
FROM TableA
CROSS JOIN TableB;
这将生成一个结果集,其中每一行都是TableA和TableB的行的一个组合。例如,如果TableA有3行,TableB有4行,结果集将包含12行。
二、内连接(INNER JOIN)是根据某个条件筛选出符合条件的记录,只连接匹配的行。不符合条件的记录不会出现在结果集中。
示例:假设有两个表Employees和Departments,表结构如下:
表名 | 列名 | 数据类型 |
---|---|---|
Employees | EmployeeID | INT |
Employees | DepartmentID | INT |
Departments | DepartmentID | INT |
Departments | DepartmentName | VARCHAR(50) |
使用内连接将这两个表连接起来,并只返回属于同一个部门的员工:
SELECT Employees.EmployeeID, Employees.DepartmentID, Departments.DepartmentName
FROM Employees
INNER JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID;
这将生成一个结果集,其中每一行都表示属于同一个部门的员工和对应的部门名称。例如,如果有3个员工和2个部门,结果集将包含若干行,但只有属于同一个部门的员工才会出现在结果集中。
三、外连接(OUTER JOIN)的结果集不仅包含符合连接条件的行,还可能包含左表、右表或两个表中的所有数据行。外连接分为左外连接(LEFT JOIN)、右外连接(RIGHT JOIN)和全外连接(FULL JOIN)。
左外连接会返回左表的所有行,以及与左表匹配的右表的行。如果右表中没有与左表匹配的行,则对应的结果集中的列将显示为NULL。
示例:继续使用前面的示例表格,现在我们使用左外连接连接这两个表,并返回所有员工以及对应的部门名称(如果有的话):
SELECT Employees.EmployeeID, Employees.DepartmentID, Departments.DepartmentName
FROM Employees
LEFT JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID;
这将生成一个结果集,其中每一行都表示一个员工以及对应的部门信息。如果某个员工没有对应的部门信息(即该员工不属于任何部门),那么结果集中的部门名称列将显示为NULL。例如,如果有3个员工和2个部门,结果集将包含若干行,那些没有对应部门的员工的结果集中的部门名称列将显示为NULL。
右外连接与左外连接类似,但返回的是右表的所有行以及与右表匹配的左表的行。如果左表中没有与右表匹配的行,则对应的结果集中的列将显示为NULL。
示例:使用前面的示例表格,现在我们使用右外连接连接这两个表,并返回所有部门以及对应的员工信息(如果有的话):
SELECT Employees.EmployeeID, Employees.DepartmentID, Departments.DepartmentName
FROM Employees
RIGHT JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID;
这将生成一个结果集,其中每一行都表示一个部门以及对应的员工信息。如果某个部门没有对应的员工信息(即该部门没有员工),那么结果集中的员工信息列将显示为NULL。例如,如果有3个员工和2个部门,结果集将包含若干行,那些没有对应员工的部门的结果集中的员工信息列将显示为NULL。
全外连接 返回左右表中的所有记录以及左右表中连接字段相等的记录。如果左表或右表中存在与另一张表没有匹配的记录,那么这些未匹配的记录也将包含在结果集中,对应的结果集中的列将显示为NULL。
示例:使用前面的示例表格,现在我们使用全外连接连接这两个表:
SELECT Employees.EmployeeID, Employees.DepartmentID, Departments.DepartmentName
FROM Employees
FULL JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID;
这将生成一个结果集,其中每一行都表示一个员工以及对应的部门信息。无论员工所属的部门是否存在,该信息都将包含在结果集中。例如,如果有3个员工和2个部门,结果集将包含若干行,那些没有对应部门的员工的结果集中的部门名称列将显示为NULL。