SQL 全连接
SQL全连接
SQL全连接 通过将两个表作为整体连接而创建一个新表。连接后的表包含来自两个表的所有记录,并在任一侧的缺失匹配中填充NULL值。简而言之,全连接是将左连接和右连接的结果集合并的一种外连接类型。
MySQL不支持全外连接。相反,您可以通过对左连接和右连接的结果集执行并集操作来模拟其工作。
让我们通过下面的维恩图详细理解这个概念。假设我们有两个表,分别表示为两个集合(由圆表示)。使用全连接获得的结果集(或新连接表)就是这两个集合的并集。
您还可以通过对左连接和右连接的结果集执行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, 'MP', 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 | MP | 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);
表格显示如下−
ID | 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 |
使用全连接合并多个表
全连接查询也可以用于合并多个表,方法是依次将两个表合并,直到所有表都被合并。
请注意,在MySQL数据库中,没有直接使用FULL JOIN关键字在多个表上执行合并操作的功能。而是计算每次两个表进行LEFT JOIN和RIGHT JOIN的UNION,直到所有表都合并。
语法
使用全连接合并多个表的语法如下所示:
SELECT column1, column2, column3...
FROM table1
FULL JOIN table2
ON condition_1
FULL JOIN table3
ON condition_2
....
....
FULL JOIN tableN
ON condition_N;
示例
为了演示全连接,让我们考虑之前创建的示例表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 |
100 | ALEKHYA | 3456 |
让我们使用下面给出的全连接查询将这三个表连接起来:
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 | 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 | 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子句
连接默认使用ON子句来过滤记录。假设我们还需要根据特定条件/约束进一步过滤这些记录,我们也可以使用WHERE子句与连接一起使用。
语法
使用WHERE子句的全连接的语法如下所示:
SELECT column_name(s)
FROM table1
FULL JOIN table2
ON table1.column_name = table2.column_name
WHERE condition;
示例
考虑前面的两个表CUSTOMERS和ORDERS;应用一些约束条件使用全连接查询将它们连接起来,使用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 |