SQL 外连接

2024 年 08 月 29 日 | 阅读 9 分钟
  • 在 SQL 外连接中,**_两个表中的所有内容都会集成在一起。_**
  • 即使两个表中的记录不匹配,匹配和不匹配的记录都将作为 SQL 外连接的输出。
  • SQL 中有三种不同类型的外连接
    1. 左外连接
    2. 右外连接
    3. 全外连接

现在,让我们通过示例深入了解 SQL 中不同类型的外连接。示例中的所有查询都将使用 MySQL 数据库编写。

假设我们有以下表格和给定数据

表 1:employee

EmployeeIDEmployee_NameEmployee_Salary
1Arun Tiwari50000
2Sachin Rathi64000
3Harshal Pathak48000
4Arjun Kuwar46000
5Sarthak Gada62000
6Saurabh Sheik53000
7Shubham Singh29000
8Shivam Dixit54000
9Vicky Gujral39000
10Vijay Bose28000

表 2:department

DepartmentIDDepartment_NameEmployee_ID
1生产1
2销售3
3营销4
4帐户5
5开发7
6HR9
7销售10

表 3:Loan

LoanIDBranch总额
1B115000
2B210000
3B320000
4B4100000
5B5150000
6B650000
7B735000
8B885000

表 4:Borrower

CustIDCustNameLoanID
1Sonakshi Dixit1
2Shital Garg4
3Swara Joshi5
4Isha Deshmukh2
5Swati Bose7
6Asha Kapoor10
7Nandini Shah9

1. 左外连接

  • 如果我们使用左外连接来组合两个不同的表,那么我们将从左表中获取所有记录。但我们只会从右表中获取那些在左表中具有相应键的记录。
  • 执行左外连接查询的语法

SELECT TableName1.columnName1, TableName2.columnName2 FROM TableName1 LEFT OUTER JOIN TableName2 ON TableName1.ColumnName = TableName2.ColumnName;

示例 1

编写一个查询来执行左外连接,将 employee 表作为左表,将 department 表作为右表。

查询

我们使用 SELECT 命令从 employee 和 department 表中检索 EmployeeID、Employee_Name、Employee_Salary、DepartmentID、Department_Name。然后,我们使用 LEFT OUTER JOIN 关键字对 employee 和 department 表执行左外连接操作,其中 'e' 和 'd' 是别名。这两个表在两个表中都存在的列 EmployeeID 上连接。

您将得到以下输出

EmployeeIDEmployee_NameEmployee_SalaryDepartmentIDDepartment_Name
1Arun Tiwari500001生产
2Sachin Rathi64000NULLNULL
3Harshal Pathak480002销售
4Arjun Kuwar460003营销
5Sarthak Gada620004帐户
6Saurabh Sheik53000NULLNULL
7Shubham Singh290005开发
8Shivam Dixit54000NULLNULL
9Vicky Gujral390006HR
10Vijay Bose280007销售

从 employee 和 department 表中检索 EmployeeID、Employee_Name、Employee_Salary、Department_ID、Department_Name。从 employee 表中检索所有记录。只有那些在 employee 表中具有相应 EmployeeID 的记录才从 department 表中检索。department 表中其余不与 employee 表的 EmployeeID 匹配的 EmployeeID 的记录将显示为 NULL。

示例 2

编写一个查询来执行左外连接,将 loan 表作为左表,将 borrower 表作为右表。

查询

我们使用 SELECT 命令从 loan 和 borrower 表中检索 LoanID、Branch、Amount、CustID、CustName。然后,我们使用 LEFT OUTER JOIN 关键字对 loan 和 borrower 表执行左外连接操作,其中 'l' 和 'b' 是别名。这两个表在两个表中都存在的列 LoanID 上连接。

您将得到以下输出

LoanIDBranch总额CustIDCustName
1B1150001Sonakshi Dixit
2B2100004Isha Deshmukh
3B320000NULLNULL
4B41000002Shital Garg
5B51500003Swara Joshi
6B650000NULLNULL
7B7350005Swati Bose
8B885000NULLNULL

从 loan 和 borrower 表中检索 LoanID、Branch、Amount、CustID、CustName。从 loan 表中检索所有记录。只有那些在 loan 表中具有相应 LoanID 的记录才从 borrower 表中检索。borrower 表中其余不与 loan 表的 LoanID 匹配的 LoanID 的记录将显示为 NULL。

2. 右外连接

  • 右外连接是左外连接的反向。如果我们使用右外连接来组合两个不同的表,那么我们将从右表中获取所有记录。但我们只会从左表中获取那些在右表中具有相应键的记录。
  • 执行右外连接查询的语法

示例 1

编写一个查询来执行右外连接,将 employee 表作为左表,将 department 表作为右表。

查询

我们使用 SELECT 命令从 employee 和 department 表中检索 EmployeeID、Employee_Name、Employee_Salary、DepartmentID、Department_Name。然后,我们使用 RIGHT OUTER JOIN 关键字对 employee 和 department 表执行右外连接操作,其中 'e' 和 'd' 是别名。这两个表在两个表中都存在的列 EmployeeID 上连接。

您将得到以下输出

EmployeeIDEmployee_NameEmployee_SalaryDepartmentIDDepartment_Name
1Arun Tiwari500001生产
3Harshal Pathak480002销售
4Arjun Kuwar460003营销
5Sarthak Gada620004帐户
7Shubham Singh290005开发
9Vicky Gujral390006HR
10Vijay Bose280007销售

从 employee 和 department 表中检索 EmployeeID、Employee_Name、Employee_Salary、DepartmentID、Department_Name。从 department 表中检索所有记录。只有那些在 department 表中具有相应 EmployeeID 的记录才从 employee 表中检索。

示例 2

编写一个查询来执行右外连接,将 loan 表作为左表,将 borrower 表作为右表。

查询

我们使用 SELECT 命令从 loan 和 borrower 表中检索 LoanID、Branch、Amount、CustID、CustName。然后,我们使用 RIGHT OUTER JOIN 关键字对 loan 和 borrower 表执行右外连接操作,其中 'l' 和 'b' 是别名。这两个表在两个表中都存在的列 LoanID 上连接。

您将得到以下输出

LoanIDBranch总额CustIDCustName
1B1150001Sonakshi Dixit
4B41000002Shital Garg
5B51500003Swara Joshi
2B2100004Isha Deshmukh
7B7350005Swati Bose
NULLNULLNULL6Asha Kapoor
NULLNULLNULL7Nandini Shah

从 loan 和 borrower 表中检索 LoanID、Branch、Amount、CustID、CustName。从 borrower 表中检索所有记录。只有那些在 borrower 表中具有相应 LoanID 的记录才从 loan 表中检索。loan 表中其余不与 borrower 表的 LoanID 匹配的 LoanID 的记录将显示为 NULL。

3. 全外连接

  • 如果我们使用全外连接来组合两个不同的表,**_那么我们将从两个表中获取所有记录_**,即,我们将从左表和右表中获取所有记录。
  • **MySQL 不直接支持 FULL OUTER JOIN**。因此,要在 MySQL 中实现全外连接,我们将在单个查询中执行两个查询。第一个查询是 LEFT OUTER JOIN,第二个查询是 RIGHT OUTER JOIN。我们将使用 UNION 运算符组合第一个和第二个查询以查看 FULL OUTER JOIN 的结果。
  • 执行全外连接查询的语法

示例 1

编写一个查询来执行全外连接,将 employee 表作为左表,将 department 表作为右表。

查询

我们使用 SELECT 命令从 employee 和 department 表中检索 EmployeeID、Employee_Name、Employee_Salary、DepartmentID、Department_Name。然后,我们使用 LEFT OUTER JOIN 关键字对 employee 和 department 表执行左外连接操作,其中 'e' 和 'd' 是别名。然后我们编写了一个 SELECT 查询来对 employee 和 department 表执行右外连接操作,其中 'e' 和 'd' 是别名。这两个表在两个表中都存在的列 EmployeeID 上连接。两个 SELECT 查询都使用 UNION 运算符组合。

您将得到以下输出

EmployeeIDEmployee_NameEmployee_SalaryDepartmentIDDepartment_Name
1Arun Tiwari500001生产
3Harshal Pathak480002销售
4Arjun Kuwar460003营销
5Sarthak Gada620004帐户
7Shubham Singh290005开发
9Vicky Gujral390006HR
10Vijay Bose280007销售
2Sachin Rathi64000NULLNULL
6Saurabh Sheik53000NULLNULL
8Shivam Dixit54000NULLNULL

从 employee 和 department 表中检索 EmployeeID、Employee_Name、Employee_Salary、Department_ID、Department_Name。由于左外连接,从 employee 表中检索所有记录。只有那些在 employee 表中具有相应 EmployeeID 的记录才从 department 表中检索。department 表中其余不与 employee 表的 EmployeeID 匹配的 EmployeeID 的记录将显示为 NULL。由于右外连接,从 department 表中检索所有记录。只有那些在 department 表中具有相应 EmployeeID 的记录才从 employee 表中检索。

示例 2

编写一个查询来执行全外连接,将 loan 表作为左表,将 borrower 表作为右表。

查询

我们使用 SELECT 命令从 loan 和 borrower 表中检索 LoanID、Branch、Amount、CustID、CustName。然后,我们使用 LEFT OUTER JOIN 关键字对 loan 和 borrower 表执行左外连接操作,其中 'l' 和 'b' 是别名。然后我们编写了一个 SELECT 查询来对 loan 和 borrower 表执行右外连接操作,其中 'l' 和 'b' 是别名。这两个表在两个表中都存在的列 LoanID 上连接。两个 SELECT 查询都使用 UNION 运算符组合。

您将得到以下输出

LoanIDBranch总额CustIDCustName
1B1150001Sonakshi Dixit
2B2100004Isha Deshmukh
3B320000NULLNULL
4B41000002Shital Garg
5B51500003Swara Joshi
6B650000NULLNULL
7B7350005Swati Bose
8B885000NULLNULL
NULLNULLNULL6Asha Kapoor
NULLNULLNULL7Nandini Shah

从 loan 和 borrower 表中检索 LoanID、Branch、Amount、CustID、CustName。由于左外连接,从 loan 表中检索所有记录。只有那些在 loan 表中具有相应 LoanID 的记录才从 borrower 表中检索。borrower 表中其余不与 loan 表的 LoanID 匹配的 LoanID 的记录将显示为 NULL。由于右外连接,从 borrower 表中检索所有记录。只有那些在 borrower 表中具有相应 LoanID 的记录才从 loan 表中检索。loan 表中其余不与 borrower 表的 LoanID 匹配的 LoanID 的记录将显示为 NULL。


下一主题SQL 左连接