在本教程中,我们将学习如何使用MySQL UNION操作符从多个SELECT语句将两个或多个结果集组合成一个结果集。



MySQL UNION操作符

MySQL UNION运算符允许您从多个表查询出来的两个或多个结果集组合成一个结果集。 MySQL UNION的语法如下:



SELECT column1,column2
UNION[DISTINCT|ALL]
SELECT column1,column2
UNION[DISTINCT|ALL]
…



执行上面的 SQL 语句后,得到下面的结果 - 执行上面的 SQL 语句后,得到下面的结果 - 有一些使用UNION运算符需要遵循的规则:

  • 显示在相应SELECT语句列数量必须相等。
  • 现在每个SELECT语句的列对应的位置必须具有相同的数据类型,或至少是可转换的数据类型。

默认情况下,UNION运算符从结果集中清除重复行,即使没有明确使用DISTINCT操作符。因此,也就是说UNION子句是UNION DISTINCT的一种快捷方式。

如果使用UNION ALL明确地保留重复行,如果有的话它将保留在结果集中。UNION ALL性能比UNION DISTINCT更快。



MySQL UNION示例

现在使用MySQL UNION 来作一些例子和练习,以帮助我们更好地理解它。

假设我们想将 customer 表和 employee 表中的数据合并到一个单一的结果集,则可以UNION运算符,下面的查询:


SELECT customer_id id, contact_name name
    FROM studymysql.customer
UNION
SELECT employee_id id, employee_name name
    FROM studymysql.employee

执行上面的 SQL 语句后,得到下面的结果 - 



MySQL UNION不使用别名

在上面的例子中,我们在SELECT语句的每一列使用了列别名。如果我们不使用列别名输出会是什么?MySQL在第一个SELECT语句使用的列名作为标签输出。

接下来让我们尝试不使用列的别名合并 customer 和 employee 表信息,如下查询:



(SELECT customer_id,contact_name
FROM studymysql.customer)
UNION
(SELECT employee_id, employee_name
FROM studymysql.employee)
ORDER BY contact_name,customer_id



结果中有 customerNumber 和 contactLastname 标签,这是第一个SELECT语句中列的名称。



MySQL UNION 与 ORDER BY

如果想在UNION运算符中对查询返回结果集进行排序,则需要在SQL中最后的那个 SELECT语句使用ORDER BY子句。

让我们来看看下面的例子:



(SELECT customer_id id, contact_name name
FROM studymysql.customer)
UNION
(SELECT employee_id id, employee_name name
FROM studymysql.employee)
ORDER BY name,id


执行上面的 SQL 语句后,得到下面的结果 - 

在上面的查询中,我们首先使用 UNION 操作符合并 employee 表和 customer 表的 ID 和 name  到一个结果集。 然后我们通过使用ORDER BY子句排序结果集。请注意,我们把SELECT语句放在括号内,并把ORDER BY子句作为最后一个语句。

如果将ORDER BY子句放在每个SELECT语句中,也不会影响UNION运算符所产生的最终结果行的顺序。

MySQL还提供了另外一种方案 - 基于列位置使用ORDER BY子句将结果集进行排序,如下面的查询:


(SELECT customer_id,contact_name
FROM studymysql.customer)
UNION
(SELECT employee_id,employee_name
FROM studymysql.employee)
ORDER BY 2,1


执行上面的 SQL 语句后,得到下面的结果 -


在本教程中,您已经学会了如何使用MySQL UNION语句从多个表中查询数据并合并成一个结果集。