SQL Server 全连接类型返回左表和右表中存在的所有记录(或行)。所有不匹配的行将填充 NULL 值。
SQL Server 全连接也可以称为全外连接。因此,使用 Outer 关键字是可选的。为了更好地理解,让我们看看它的可视化表示。从下图中,您可以轻松理解全连接显示表 1 和表 2 中存在的所有记录。全连接的语法如下所示:
SELECT Table1.Column(s), Table2.Column(s),
FROM Table1
FULL OUTER JOIN
Table2 ON
Table1.Common_Column = Table2.Common_Column
--OR We can Simply Write it as
SELECT Table1. Column(s), Table2. Column(s),
FROM Table1
FULL JOIN
Table2 ON
Table1.Common_Column = Table2.Common_Column
为了演示全连接,我们将使用数据库中存在的两个表(Employee 和 Department)。Employee 表中存在的数据是:


SQL Server Department 表中存在的数据是:

SQL 全外连接选择所有列
以下选择所有列的查询将显示 Employees 和 Department 中的所有列和行。
SELECT *
FROM [Employee]
FULL OUTER JOIN
[Department] ON
[Employee].[DepartID] = [Department].[id]

- 如果您观察上面的截图,尽管 Employee 表中有 15 条记录,但全外连接合并并显示了 17 条记录,因为 Department 表中有两条记录,即部门 ID 3, 4(Module Lead 和 Team Lead),15 + 2 = 17 条总记录。
- Employees 表中没有与部门 ID 3 和 4(Module Lead 和 Team Lead)匹配的记录,因此它们被 NULL 值替换。
- [DepartID]、id、[Department Name] 的 ID 号 10、11、14 和 15 显示 NULL 值。因为它们在 Employee 表中的部门 ID 为 NULL,所以在右表中没有匹配的记录。
不带 Outer 关键字的全连接
如前所述,在此连接类型中使用 Outer 关键字是可选的。让我删除 Outer 关键字,然后使用 FULL JOIN。
SELECT *
FROM [Employee]
FULL JOIN
[Department] ON
[Employee].[DepartID] = [Department].[id]

注意:[Department ID] 列重复两次,这会让用户感到困扰。通过选择单独的列名,我们可以避免不需要的列,因此请避免使用 SELECT * 语句。
SQL 全连接选择部分列
请将所需的字段放在 SELECT 语句之后,以避免不需要的列。
SELECT [FirstName]
,[LastName]
,[DepartmentName]
FROM [Employee]
FULL JOINSelect Few Columns
[Department] ON
[Employee].[DepartID] = [Department].[id]

只要两个表(Employee 和 Department)中的列名不同,上述查询就能完美运行。
如果两个表中有相同的列名会发生什么?那么,您将陷入混乱。让我们看看如何解决这个问题。在进入解决方案之前,让我向您展示一个实际例子。
如您所见,我们正在使用上面的 SQL 全连接查询。但是,我们添加了 Department 表中的 id 作为附加列。
SELECT [FirstName]
,[LastName]
,id
,[DepartmentName]
FROM [Employee]
FULL OUTER JOIN
[Department] ON
[Employee].[DepartID] = [Department].[id]
如您所见,连接表会引发错误:列名 id 模糊。这是因为 id 在 Employee 和 Department 表中都存在。SQL Server 不知道您希望它检索哪一个。

为了解决这个问题,您始终必须在列名前使用表名。例如,以下代码在列名前使用别名表名。通过这种方法,我们可以告知服务器我们正在寻找属于 Department 表的 id。
我们可以将上述查询写为:
SELECT Emp.[FirstName] AS [First Name]
,Emp.[LastName] AS [Last Name]
,Dept.id
,Dept.[DepartmentName] AS [Department Name]
FROM [Employee] AS Emp
FULL JOIN
[Department] AS Dept ON
Emp.[DepartID] = Dept.[id]

Where 子句中的 SQL Server 全外连接
它还允许我们使用 Where 子句来限制此查询返回的行数。因此,在此示例中,我们将使用 WHERE 子句和全连接。
SELECT Emp.[FirstName] AS [First Name]
,Emp.[LastName] AS [Last Name]
,Dept.[DepartmentName] AS [Department Name]
FROM [Employee] AS Emp
FULL OUTER JOIN
[Department] AS Dept ON
Emp.[DepartID] = Dept.[id]
WHERE Dept.[DepartmentName] IS NOT NULL

全外连接 Order By 子句
它允许我们使用 Order By 子句重新排列记录的顺序。
SELECT Emp.[FirstName] AS [First Name]
,Emp.[LastName] AS [Last Name]
,Dept.[DepartmentName] AS [Department Name]
FROM [Employee] AS Emp
FULL OUTER JOIN
[Department] AS Dept ON
Emp.[DepartID] = Dept.[id]
ORDER BY [DepartmentName] ASC
