SQL - UNION 运算符


SQL UNION 运算符

SQL UNION 运算符用于通过消除重复行(如果有)来合并多个表中的数据。

要在多个表上使用 UNION 运算符,所有这些表必须是联合兼容的。当且仅当它们满足以下标准时,才被认为是工会兼容的 -

  • 使用相同数据类型选择相同数量的列。
  • 这些列也必须具有相同的顺序。
  • 它们不需要具有相同的行数。

一旦满足这些条件,UNION 运算符就会将多个表中的行作为结果表返回,该结果表中不包含这些表中的所有重复值。

最终结果集中的列名将基于第一个 SELECT 语句中选择的列名。如果要对最终结果集中的列使用不同的名称,可以在 SELECT 语句中使用别名。

句法

UNION运算符的基本语法如下 -

SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
UNION
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition];

这里,给定的条件可以是根据您的要求的任何给定表达式。

单个字段上的 UNION

如果我们想使用 UNION 将两个或多个 SELECT 语句的结果集组合到单个字段上,我们只需将该字段包含在每个查询的 SELECT 语句中即可。UNION 运算符将自动删除最终结果集中的所有重复值。

当对单个字段使用 UNION 时,结果集中的列名将由第一个 SELECT 语句中的列名确定。因此,您可能需要在 SELECT 语句中使用别名来确保列名对于最终结果集有意义。

例子

假设我们使用 CREATE TABLE 语句在 MySQL 数据库中创建了一个名为 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);

CUSTOMERS 表如下 -

ID 姓名 年龄 地址 薪水
1 拉梅什 32 艾哈迈达巴德 2000.00
2 基兰 25 德里 1500.00
3 考希克 23 科塔 2000.00
4 柴塔利 25 孟买 6500.00
5 哈迪克 27 博帕尔 8500.00
6 科马尔 22 海得拉巴 4500.00
7 莫菲 24 印多尔 10000.00

现在,使用 CREATE TABLE 语句创建第二个表 ORDERS,如下所示 -

CREATE TABLE ORDERS (
   OID INT NOT NULL,
   DATE DATETIME NOT NULL,
   CUSTOMER_ID INT NOT NULL,
   AMOUNT INT NOT NULL,      
   PRIMARY KEY (OID)
);

以下查询使用 INSERT 语句将值插入到该表中 -

INSERT INTO ORDERS VALUES
(102, '2009-10-08 00:00:00', 3, 3000),
(100, '2009-10-08 00:00:00', 3, 1500),
(101, '2009-11-20 00:00:00', 2, 1560),
(103, '2008-05-20 00:00:00', 4, 2060);

订单表如下 -

奥德 日期 客户ID 数量
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

使用以下查询,让我们组合 CUSTOMERS 和 ORDERS 表中的 SALARY 和 AMOUNT 列(因为这些列具有相似的数据类型) -

SELECT SALARY FROM CUSTOMERS UNION SELECT AMOUNT FROM ORDERS;

输出

上述查询的输出如下 -

薪水
2000.00
1500.00
6500.00
8500.00
4500.00
10000.00
3000.00
1560.00
2060.00

多个领域的 UNION

当我们对多个字段使用 UNION 时,每个 SELECT 语句中字段的数量和顺序必须匹配。此外,每个 SELECT 语句中字段的数据类型必须兼容,UNION 才能正常工作。如果数据类型不兼容,您可能需要使用转换函数(例如 CAST 或 CONVERT)来确保数据类型匹配。

例子

由于 CUSTOMERS 和 ORDERS 表各自不兼容联合,因此我们首先使用 Left Join 和 Right Join 将这两个表连接成一个更大的表。检索到的连接表将具有相同数量的相同数据类型的列,从而与联合兼容。现在,这些表使用 UNION 查询进行组合,如下所示 -

SELECT  ID, NAME, AMOUNT, DATE FROM CUSTOMERS
LEFT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
UNION
SELECT  ID, NAME, AMOUNT, DATE FROM CUSTOMERS
RIGHT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

输出

这将产生以下结果 -

ID 姓名 数量 日期
1 拉梅什 无效的 无效的
2 基兰 1560 2009-11-20 00:00:00
3 考希克 3000 2009-10-08 00:00:00
3 考希克 1500 2009-10-08 00:00:00
4 柴塔利 2060 2008-05-20 00:00:00
5 哈迪克 无效的 无效的
6 科马尔 无效的 无效的
7 莫菲 无效的 无效的

UNION 与 WHERE 子句

我们可以使用 WHERE 子句和 UNION 运算符来过滤每个 SELECT 语句的结果,然后再将它们组合起来。

句法

以下是将 WHERE 子句与 UNION 运算符一起使用的语法 -

SELECT column1, column2, column3
FROM table1
WHERE column1 = 'value1'
UNION
SELECT column1, column2, column3
FROM table2
WHERE column1 = 'value2';

例子

在下面的查询中,我们分别从“CUSTOMERS”和“ORDERS”表中检索 id 大于 5 和 2 的客户的 id -

SELECT ID, SALARY FROM CUSTOMERS WHERE ID > 5
UNION
SELECT CUSTOMER_ID, AMOUNT FROM ORDERS WHERE CUSTOMER_ID > 2;

输出

以下是产生的结果 -

ID 薪水
6 4500.00
7 10000.00
3 3000.00
3 1500.00
4 2060.00

UNION 与 ORDER BY 子句

当我们将 UNION 与 ORDER BY 子句一起使用时,它会组合所有 SELECT 语句的排序结果集并生成单个排序结果集。

例子

在这里,我们分别从 'CUSTOMERS' 和 'ORDERS' 表中检索 id 大于 5 和 2 的客户的 id,从他们的工资从低到高排序 -

SELECT ID, SALARY FROM CUSTOMERS WHERE ID > 5
UNION
SELECT CUSTOMER_ID, AMOUNT FROM ORDERS WHERE CUSTOMER_ID > 2
ORDER BY SALARY;

输出

以下是上述查询的输出 -

ID 薪水
3 1500.00
4 2060.00
3 3000.00
6 4500.00
7 10000.00
UNION 语句中的 ORDER BY 子句适用于整个结果集,而不仅仅是最后一个 SELECT 语句。

与别名的 UNION

我们可以在 UNION 运算符的 SELECT 语句中使用别名来为表或列提供临时名称,这在处理具有相似名称的多个表或列时非常有用。

将 UNION 与别名一起使用时,请务必注意列别名由第一个 SELECT 语句确定。因此,如果要在不同的 SELECT 语句中对同一列使用不同的别名,则需要在所有 SELECT 语句中使用列别名,以保证最终结果集中的列名一致。

句法

以下是使用 Union 与别名的语法 -

SELECT column1 AS alias1, column2 AS alias2
FROM table1
UNION
SELECT column3 AS alias1, column4 AS alias2
FROM table2;

例子

以下查询从两个表中检索所有 id,以及每个 id 是属于客户还是属于他们的订单的指示 -

SELECT ID, 'customer' AS type FROM CUSTOMERS
UNION
SELECT OID, 'order' AS type FROM ORDERS;

输出

以下是产生的输出 -

ID 类型
1 顾客
2 顾客
3 顾客
4 顾客
5 顾客
6 顾客
7 顾客
100 命令
101 命令
102 命令
103 命令

还有另外两个运算符类似于 UNION 运算符。

  • SQL INTERSECT 运算符- 用于组合两个 SELECT 语句,但仅返回第一个 SELECT 语句中与第二个 SELECT 语句中的行相同的行。

  • SQL EXCEPT 运算符- 这组合了两个 SELECT 语句,并返回第一个 SELECT 语句中第二个 SELECT 语句未返回的行。