MySQL UNION运算符
简介:在本教程中,您将学习如何使用MySQL UNION运算符将来自多个SELECT语句的两个或多个结果集组合为一个结果集。
MySQL UNION运算符
MySQL UNION运算符允许您将两个或多个查询结果集组合为一个结果集。
下面说明了UNION运算符的语法:
SELECT column_list UNION [DISTINCT | ALL] SELECT column_list UNION [DISTINCT | ALL] SELECT column_list ...
要使用UNION运算符组合两个或多个查询的结果集,必须遵循以下基本规则:
首先,出现在所有SELECT语句中的列的数量和顺序必须相同。
其次,列的数据类型必须相同或兼容。
默认情况下,即使您未明确指定DISTINCT运算符,UNION运算符也会删除重复的行。
我们来看看以下示例表:t1和t2:
DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t2; CREATE TABLE t1 ( id INT PRIMARY KEY ); CREATE TABLE t2 ( id INT PRIMARY KEY ); INSERT INTO t1 VALUES (1),(2),(3); INSERT INTO t2 VALUES (2),(3),(4);
以下语句合并了从t1和t2表返回的结果集:
SELECT id FROM t1 UNION SELECT id FROM t2;
最终结果集包含查询返回的单独结果集中的不同值:
+----+ | id | +----+ | 1 | | 2 | | 3 | | 4 | +----+ 4 rows in set (0.00 sec)
由于具有值2和3的行是重复的,因此UNION删除了它们并仅保留唯一的值。
下面的维恩图说明了来自t1和t2表的两个结果集的并集:
如果显式使用UNION ALL,则重复的行(如果有)将保留在结果中。
因为UNION ALL不需要处理重复项,所以它的执行速度比UNION DISTINCT要快。
SELECT id FROM t1 UNION ALL SELECT id FROM t2;
+----+ | id | +----+ | 1 | | 2 | | 3 | | 2 | | 3 | | 4 | +----+ 6 rows in set (0.00 sec)
如您所见,由于UNIION ALL操作,重复项出现在合并的结果集中。
联盟vs.加入
JOIN水平组合结果集,UNION垂直附加结果集。
下图说明了UNION和JOIN之间的区别:
MySQL UNION和列别名示例
我们将使用示例数据库中的客户和雇员表进行演示:
假设您要将员工和客户的名字和姓氏合并为一个结果集,则可以使用UNION运算符,如下所示:
SELECT firstName, lastName FROM employees UNION SELECT contactFirstName, contactLastName FROM customers;
从输出中可以看到,MySQL UNION使用第一个SELECT语句的列名称作为输出的列标题。
如果要使用其他列标题,则需要在第一个SELECT语句中显式使用列别名,如以下示例所示:
SELECT CONCAT(firstName,' ',lastName) fullname FROM employees UNION SELECT CONCAT(contactFirstName,' ',contactLastName) FROM customers;
本示例将第一个查询的列标题用于输出。
它使用CONCAT()函数将名字,空格和姓氏连接为一个全名。
MySQL UNION和ORDER BY
如果要对并集的结果集进行排序,请在最后一个SELECT语句中使用ORDER BY子句,如以下示例所示:
SELECT concat(firstName,' ',lastName) fullname FROM employees UNION SELECT concat(contactFirstName,' ',contactLastName) FROM customers ORDER BY fullname;
请注意,如果将ORDER BY子句放在每个SELECT语句中,则不会影响最终结果集中的行顺序。
为了区分雇员和客户,您可以添加一列,如以下查询所示:
SELECT CONCAT(firstName, ' ', lastName) fullname, 'Employee' as contactType FROM employees UNION SELECT CONCAT(contactFirstName, ' ', contactLastName), 'Customer' as contactType FROM customers ORDER BY fullname
MySQL还为您提供了一个替代选项,可使用ORDER BY子句根据列位置对结果集进行排序,如下所示:
SELECT CONCAT(firstName,' ',lastName) fullname FROM employees UNION SELECT CONCAT(contactFirstName,' ',contactLastName) FROM customers ORDER BY 1;
但是,按列位置对结果集进行排序不是一个好习惯。
在本教程中,您学习了如何使用MySQL UNION语句将来自多个查询的数据组合到单个结果集中。