SQL Full Join 怎么用?全连接查询如何匹配左右表所有数据?

文章导读
上一个 测验 下一个 SQL 全连接 (Full Join) SQL Full Join 通过将两个表整体连接来创建一个新表。连接后的表包含两个表中的所有记录,对于任一边缺少的匹配项会填充 NULL 值。简而言之,full join 是一种 outer join,它结合了
📋 目录
  1. SQL 全连接 (Full Join)
  2. 使用 Full Join 连接多个表
  3. 带 WHERE 子句的 Full Join
A A

SQL - 全连接 (Full Join)

目录
  • SQL 全连接
  • 使用 Full Join 连接多个表
  • 带 WHERE 子句的 Full Join


上一个
测验
下一个

SQL 全连接 (Full Join)

SQL Full Join 通过将两个表整体连接来创建一个新表。连接后的表包含两个表中的所有记录,对于任一边缺少的匹配项会填充 NULL 值。简而言之,full join 是一种 outer join,它结合了 left join 和 right join 的结果集。

MySQL 不支持 Full Outer Join。相反,您可以通过对 Left Join 和 Right Join 获得的结果集执行 union 操作来模拟其功能。

让我们通过下面的 Venn 图详细理解这个概念。假设我们有两个表作为两个集合(用圆圈表示)。使用 full join 得到的结果集(或新连接的表)就是这两个集合的并集。

Full Join
您也可以通过对 LEFT JOIN 和 RIGHT JOIN 的结果集执行 UNION 操作来获得等效的 FULL JOIN 结果集。

语法

以下是 SQL 中 Full Join 的基本语法 −

SELECT column_name(s)
FROM table1
FULL JOIN table2
ON table1.column_name = table2.column_name;

示例

假设我们创建了一个名为 CUSTOMERS 的表,其中包含客户的个人信息,包括姓名、年龄、地址和薪资等。使用以下查询 −

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),       
   PRIMARY KEY (ID)
);

现在使用 INSERT 语句向该表插入值,如下所示 −

INSERT INTO CUSTOMERS VALUES
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(2, 'Khilan', 25, 'Delhi', 1500.00 ),
(3, 'Kaushik', 23, 'Kota', 2000.00 ),
(4, 'Chaitali', 25, 'Mumbai', 6500.00 ),
(5, 'Hardik', 27, 'Bhopal', 8500.00 ),
(6, 'Komal', 22, 'Hyderabad', 4500.00 ),
(7, 'Muffy', 24, 'Indore', 10000.00 );

表将创建如下 −

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

让我们创建另一个表 ORDERS,其中包含订单详情和订单日期。

CREATE TABLE ORDERS (
   OID INT NOT NULL,
   DATE VARCHAR (20) NOT NULL,
   CUSTOMER_ID INT NOT NULL,
   AMOUNT DECIMAL (18, 2)
);

使用 INSERT 语句向该表插入值,如下所示 −

INSERT INTO ORDERS VALUES 
(102, '2009-10-08 00:00:00', 3, 3000.00),
(100, '2009-10-08 00:00:00', 3, 1500.00),
(101, '2009-11-20 00:00:00', 2, 1560.00),
(103, '2008-05-20 00:00:00', 4, 2060.00);

表显示如下 −

OID DATE CUSTOMER_ID AMOUNT
102 2009-10-08 00:00:00 3 3000.00
100 2009-10-08 00:00:00 3 1500.00
101 2009-11-20 00:00:00 2 1560.00
103 2008-05-20 00:00:00 4 2060.00

以下查询在 SQL Server 中连接两个表 CUSTOMERS 和 ORDERS −

SELECT ID, NAME, AMOUNT, DATE
FROM CUSTOMERS
FULL JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

输出

结果表生成如下 −

ID NAME AMOUNT DATE
1 Ramesh NULL NULL
2 Khilan 1560 2009-11-20 00:00:00
3 Kaushik 3000 2009-10-08 00:00:00
3 Kaushik 1500 2009-10-08 00:00:00
4 Chaitali 2060 2008-05-20 00:00:00
5 Hardik NULL NULL
6 Komal NULL NULL
7 Muffy NULL NULL

使用 Full Join 连接多个表

Full Join 查询也可以用于连接不止两个表。要实现这一点,我们可以依次每次连接两个表,直到所有表都被连接在一起。

请注意,在 MySQL 数据库中,没有直接使用 FULL JOIN 关键字对多个表执行连接操作的语法。相反,需要计算每次两个表的 LEFT JOIN 和 RIGHT JOIN 的 UNION,直到所有表都被连接。

语法

使用 Full Join 连接多个表的语法如下所示 −

SELECT column1, column2, column3... 
FROM table1
FULL JOIN table2
ON condition_1
FULL JOIN table3
ON condition_2
....
....
FULL JOIN tableN
ON condition_N;

示例

为了演示 Full Join,我们考虑之前创建的示例表 CUSTOMERS 和 ORDERS,并使用以下查询创建一个名为 EMPLOYEE 的新表 −

CREATE TABLE EMPLOYEE (
   EID INT NOT NULL,
   EMPLOYEE_NAME VARCHAR (30) NOT NULL,
   SALES_MADE DECIMAL (20)
);

现在,我们可以使用 INSERT 语句向这个空表中插入值,如下所示 −

INSERT INTO EMPLOYEE VALUES
(102, 'SARIKA', 4500),
(100, 'ALEKHYA', 3623),
(101, 'REVATHI', 1291),
(103, 'VIVEK', 3426);

创建的 EMPLOYEE 表将如下所示 −

EID EMPLOYEE_NAMENAME SALES_MADE
102 SARIKA 4500
100 ALEKHYA 3623
101 REVATHI 1291
103 VIVEK 3426

让我们使用以下 full join 查询连接这三个表 −

SELECT CUSTOMERS.ID, CUSTOMERS.NAME, ORDERS.DATE, EMPLOYEE.EMPLOYEE_NAME 
FROM CUSTOMERS 
FULL JOIN ORDERS 
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID 
FULL JOIN EMPLOYEE 
ON ORDERS.OID = EMPLOYEE.EID; 

通过这个查询,我们将显示客户的 id 和 name,以及订单日期和销售该物品的员工姓名。

输出

结果表如下所示 −

ID NAME DATE EMPLOYEE_NAME
1 Ramesh NULL NULL
2 Khilan 2009-11-20 00:00:00 REVATHI
3 Kaushik 2009-10-08 00:00:00 ALEKHYA
3 Kaushik 2009-10-08 00:00:00 SARIKA
4 Chaitali 2008-05-20 00:00:00 VIVEK
5 Hardik NULL NULL
6 Komal NULL NULL
7 Muffy NULL NULL

带 WHERE 子句的 Full Join

连接操作默认使用 ON 子句来过滤记录。假设有进一步需求需要根据特定条件/约束过滤这些记录,我们也可以在连接中使用 WHERE 子句。

语法

Full Join 与 WHERE 子句结合使用的语法如下所示 −

SELECT column_name(s)
FROM table1
FULL JOIN table2
ON table1.column_name = table2.column_name
WHERE condition;

示例

考虑之前的两个表 CUSTOMERS 和 ORDERS,并使用以下 Full Join 查询连接它们,同时使用 WHERE 子句应用一些约束。

SELECT ID, NAME, DATE, AMOUNT FROM CUSTOMERS
FULL JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
WHERE ORDERS.AMOUNT > 2000.00;

输出

应用 WHERE 子句后的结果表包含金额值大于 2000.00 的行 −

ID NAME DATE AMOUNT
3 Kaushik 2009-10-08 00:00:00 3000.00
4 Chaitali 2008-05-20 00:00:00 2060.00