Mysql 简明教程

MySQL - UNION Operator

MySQL UNION Operator

MySQL 中的 UNION 运算符组合来自多个表的数据(无重复记录)。

如果我们想按顺序从多个表或来自单个表的多组行中选择行,则可以使用 UNION 将它们全部作为一个单一的结果集。

要在多张表上使用 UNION 运算符,所有这些表必须具有并集兼容性。并且仅当它们符合以下条件时,才认为它们具有并集兼容性 −

  1. 选择相同数量的具有相同数据类型的列。

  2. 这些列还必需按相同顺序排列。

  3. 它们不需要有相同数目的行。

满足这些条件后,UNION 运算符会将来自多个表的行作为结果表返回,该表不包含任何这些表中的重复值。

UNION 可用于 MySQL 4.0。本部分说明如何使用它。

Syntax

MySQL 中 UNION 运算符的基本语法如下 −

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

Example

让我们首先使用以下 CREATE TABLE 查询创建名为 PROSPECT 的潜在客户表 −

CREATE TABLE PROSPECT (
   FNAME CHAR(20) NOT NULL,
   LNAME CHAR(20),
   ADDRESS VARCHAR(100) NOT NULL
);

现在,我们使用以下 INSERT 语句向此表中插入记录 −

INSERT INTO PROSPECT VALUES
('Peter', 'Jones', '482 Rush St., Apt. 402'),
('Bernice', 'Smith', '916 Maple Dr.');

PROSPECT 表创建为 −

ACTIVE Table −

然后,我们使用以下 CREATE TABLE 查询创建名为 ACTIVE 的活跃客户表 −

CREATE TABLE ACTIVE (
   FNAME CHAR(20) NOT NULL,
   LNAME CHAR(20),
   ADDRESS VARCHAR(100) NOT NULL
);

使用以下 INSERT 语句向 ACTIVE 表中插入记录 −

INSERT INTO ACTIVE VALUES
('Grace', 'Peterson', '16055 Seminole Ave.'),
('Bernice', 'Smith', '916 Maple Dr.'),
('Walter', 'Brown', '8602 1st St.');

ACTIVE 表的创建如下所示:

现在,您想通过合并所有表中的名称和地址来创建一个单独的邮件列表。UNION 提供了一种实现此操作的方法。

以下查询说明了如何同时从所有表中选择名称和地址:

SELECT FNAME, LNAME, ADDRESS FROM PROSPECT
UNION
SELECT FNAME, LNAME, ADDRESS FROM ACTIVE;

Output

获得了以下输出 -

正如您所见,在结果集中避免了重复项。

UNION with WHERE clause

我们可以在 UNION 运算符中使用 WHERE 子句来在组合之前过滤每个 SELECT 语句的结果。

Syntax

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

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

Example

让我们使用上一个示例中的相同表,使用 UNION 运算符和 WHERE 子句来检索合并的记录:

SELECT FNAME, LNAME, ADDRESS FROM PROSPECT WHERE LNAME = 'Jones'
UNION
SELECT FNAME, LNAME, ADDRESS FROM ACTIVE WHERE LNAME = 'Peterson';

Output

获得了以下输出 -

UNION with ORDER BY clause

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

Syntax

以下是使用 UNION 运算符和 ORDER BY 子句的基本语法:

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2
ORDER BY column_name;

Example

让我们尝试使用以下查询,按照结果集中“lname”列中的值对表记录进行升序排序:

SELECT FNAME, LNAME, ADDRESS FROM PROSPECT
UNION
SELECT FNAME, LNAME, ADDRESS FROM ACTIVE
ORDER BY LNAME;

Output

获得了以下输出 -

UNION with Aliases

我们可以在 UNION 运算符的 MySQL 语句中使用别名,给表或列一个临时名称,这在使用具有相似的名称的多个表或列时非常有用。

与别名一起使用 UNION 时,需要注意的是列别名是由第一个 SELECT 语句决定的。因此,如果您想为不同 SELECT 语句中的同一列使用不同的别名,则需要在所有 SELECT 语句中使用列别名,以确保最终结果集中列名称的一致性。

Syntax

下面是用别名使用 Union 的语法 -

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

Example

在以下示例中,我们尝试使用别名组合两个表,以表示获得的结果集中字段:

SELECT FNAME AS Firstname,
LNAME AS Lastname, ADDRESS AS Address
FROM PROSPECT UNION
SELECT FNAME, LNAME, ADDRESS FROM ACTIVE;

Output

获得了以下输出 -

UNION ALL Operator

如果您想要选择所有记录(包括重复项),请使用第一个 UNION 关键字 ALL:

SELECT fname, lname, ADDRESS  FROM prospect
UNION ALL
SELECT fname, lname, ADDRESS  FROM active;

Output

获得了以下输出 -

UNION Operator Using Client Program

除了在 MySQL 服务器中直接在 MySQL 表中应用 UNION 运算符外,我们还可以使用客户端程序对 MySQL 表应用 UNION 操作。

Syntax

以下是不同编程语言中 MySQL 表中的 UNION 运算符语法:

Example

以下是该操作在各种编程语言中的实现 −