在数据库管理系统中,JOINs 是 SQL 中用于合并两个或多个表的记录的强大工具。JOINs 根据相关列之间的关系将行组合在一起。本文将详细介绍三种常见的 JOIN 类型:内连接(INNER JOIN)、外连接(OUTER JOIN,包括左外连接、右外连接和全外连接)、以及交叉连接(CROSS JOIN)。
内连接是最常用的 JOIN 类型,它返回两个表中匹配的行。如果在一个表中的行与另一个表中的行在指定的列上相等,则这些行将被返回。
假设我们有两个数据表:Employees
和 Departments
。
Employees
表:
EmployeeID | EmployeeName | DepartmentID |
---|---|---|
1 | Alice | 101 |
2 | Bob | 102 |
3 | Charlie | 103 |
4 | David | 101 |
表结构
SQLCREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
EmployeeName VARCHAR(50),
DepartmentID INT
);
测试数据
SQLINSERT INTO Employees (EmployeeID, EmployeeName, DepartmentID) VALUES
(1, 'Alice', 101),
(2, 'Bob', 102),
(3, 'Charlie', 103),
(4, 'David', 101);
Departments
表:
DepartmentID | DepartmentName |
---|---|
101 | HR |
102 | IT |
103 | Sales |
104 | Marketing |
表结构
SQLCREATE TABLE Departments (
DepartmentID INT PRIMARY KEY,
DepartmentName VARCHAR(255)
);
测试数据
SQLINSERT INTO Departments (DepartmentID, DepartmentName) VALUES
(101, 'HR'),
(102, 'IT'),
(103, 'Sales'),
(104, 'Marketing');
SQLSELECT Employees.EmployeeName, Departments.DepartmentName
FROM Employees
INNER JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;
EmployeeName | DepartmentName |
---|---|
Alice | HR |
Bob | IT |
Charlie | Sales |
David | HR |
在这个例子中,内连接返回了所有有对应部门的员工记录。
外连接包括左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。外连接不仅返回匹配的行,还返回左表、右表或两个表中未匹配的行。
左外连接返回左表的所有行,即使右表中没有匹配的行。
SQLSELECT Employees.EmployeeName, Departments.DepartmentName
FROM Employees
LEFT OUTER JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;
EmployeeName | DepartmentName |
---|---|
Alice | HR |
Bob | IT |
Charlie | Sales |
David | HR |
在这个例子中,左外连接返回了所有员工记录和他们对应的部门名称,即使有些员工没有对应的部门也会显示。
右外连接返回右表的所有行,即使左表中没有匹配的行。
SQLSELECT Employees.EmployeeName, Departments.DepartmentName
FROM Employees
RIGHT OUTER JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;
EmployeeName | DepartmentName |
---|---|
Alice | HR |
Bob | IT |
Charlie | Sales |
David | HR |
NULL | Marketing |
在这个例子中,右外连接返回了所有部门记录,以及如果有的话,对应的员工名称。
全外连接返回左表和右表中的所有行。如果行在另一边没有匹配,则对应列将为 NULL。
SQLSELECT Employees.EmployeeName, Departments.DepartmentName
FROM Employees
FULL OUTER JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;
EmployeeName | DepartmentName |
---|---|
Alice | HR |
Bob | IT |
Charlie | Sales |
David | HR |
NULL | Marketing |
在这个例子中,全外连接返回了所有员工和所有部门的记录。
交叉连接返回第一个表中的每一行与第二个表中的每一行的笛卡尔积。这意味着如果第一个表有 M 行,第二个表有 N 行,那么结果集将有 M x N 行。
SQLSELECT Employees.EmployeeName, Departments.DepartmentName
FROM Employees
CROSS JOIN Departments;
EmployeeName | DepartmentName |
---|---|
Alice | HR |
Alice | IT |
Alice | Sales |
Alice | Marketing |
Bob | HR |
Bob | IT |
Bob | Sales |
Bob | Marketing |
Charlie | HR |
Charlie | IT |
Charlie | Sales |
Charlie | Marketing |
David | HR |
David | IT |
David | Sales |
David | Marketing |
在这个例子中,交叉连接返回了员工和部门之间所有可能的组合。
JOINs 是 SQL 中的核心概念,它们使得从多个表中组合数据变得可能。根据实际需求,可以选择使用内连接、外连接或交叉连接。理解不同类型的 JOINs 如何工作,以及它们在何种情况下使用,对于任何使用 SQL 进行数据库查询的人来说都是非常重要的。
本文作者:rick
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!