SELECT ...
UNION [ALL | DISTINCT] SELECT ...
[UNION [ALL | DISTINCT] SELECT ...]
UNION
将多个SELECT
语句的结果组合成一个结果集。例子:
mysql> SELECT 1, 2;
+---+---+
| 1 | 2 |
+---+---+
| 1 | 2 |
+---+---+
mysql> SELECT 'a', 'b';
+---+---+
| a | b |
+---+---+
| a | b |
+---+---+
mysql> SELECT 1, 2 UNION SELECT 'a', 'b';
+---+---+
| 1 | 2 |
+---+---+
| 1 | 2 |
| a | b |
+---+---+
结果集列名和数据类型
结果集的列名UNION
取自第一条
SELECT
语句的列名。
SELECT
每条语句
相应位置列出的选定列
应具有相同的数据类型。例如,第一个语句选择的第一列应该与其他语句选择的第一列具有相同的类型。如果对应SELECT
列的数据类型不匹配,则
UNION
结果中列的类型和长度将考虑所有
SELECT
语句检索的值。例如,考虑以下内容,其中列长度不受第一个值的长度限制
SELECT
:
mysql> SELECT REPEAT('a',1) UNION SELECT REPEAT('b',20);
+----------------------+
| REPEAT('a',1) |
+----------------------+
| a |
| bbbbbbbbbbbbbbbbbbbb |
+----------------------+
UNION DISTINCT 和 UNION ALL
默认情况下,重复行会从
UNION
结果中删除。optional
DISTINCT
关键字具有相同的效果,但使其显式化。使用可选ALL
关键字,不会发生重复行删除,结果包括所有
SELECT
语句中的所有匹配行。
您可以在同一个查询
中混合使用UNION
ALL
和。UNION
DISTINCT
处理混合
UNION
类型时,DISTINCT
联合会覆盖
ALL
其左侧的任何联合。DISTINCT
联合可以通过 using 显式生成,也可以通过不
带任何后续
关键字或关键字
的 usingUNION
DISTINCT
隐式
生成。UNION
DISTINCT
ALL
联合中的 ORDER BY 和 LIMIT
要将ORDER BY
or
LIMIT
子句应用于 individual
SELECT
,
SELECT
请将 the 括起来并将子句放在括号内:
(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
以前版本的 MySQL 可能允许这样的语句不带括号。在 MySQL 5.7 中,强制要求使用括号。
使用ORDER BY
for 单个
SELECT
语句并不意味着行在最终结果中出现的顺序,因为UNION
默认情况下会生成一组无序的行。因此,ORDER BY
在此上下文中通常与 结合使用
LIMIT
来确定要为 检索的所选行的子集
SELECT
,即使它不一定会影响这些行在最终
UNION
结果中的顺序。如果ORDER
BY
没有出现LIMIT
在 a 中
SELECT
,它会被优化掉,因为它没有效果。
要使用ORDER BY
or
LIMIT
子句对整个
UNION
结果进行排序或限制,请将各个SELECT
语句括起来并将ORDER BY
or
LIMIT
放在最后一个语句之后:
(SELECT a FROM t1 WHERE a=10 AND B=1)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2)
ORDER BY a LIMIT 10;
没有括号的语句等同于刚才显示的带括号的语句。
这种ORDER BY
不能使用包含表名(即
tbl_name
.col_name
格式的名称)的列引用。SELECT
相反,在第一条语句中提供列别名
并在ORDER BY
. (或者,在ORDER BY
使用其列位置中引用该列。但是,不推荐使用列位置。)
Also, if a column to be sorted is aliased, the ORDER
BY
clause must refer to the
alias, not the column name. The first of the following
statements is permitted, but the second fails with an
Unknown column 'a' in 'order clause'
error:
(SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY b;
(SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY a;
To cause rows in a UNION
result
to consist of the sets of rows retrieved by each
SELECT
one after the other,
select an additional column in each
SELECT
to use as a sort column
and add an ORDER BY
that sorts on that column
following the last SELECT
:
(SELECT 1 AS sort_col, col1a, col1b, ... FROM t1)
UNION
(SELECT 2, col2a, col2b, ... FROM t2) ORDER BY sort_col;
To additionally maintain sort order within individual
SELECT
results, add a secondary
column to the ORDER BY
clause:
(SELECT 1 AS sort_col, col1a, col1b, ... FROM t1)
UNION
(SELECT 2, col2a, col2b, ... FROM t2) ORDER BY sort_col, col1a;
Use of an additional column also enables you to determine which
SELECT
each row comes from. Extra
columns can provide other identifying information as well, such
as a string that indicates a table name.
UNION
queries with an aggregate
function in an ORDER BY
clause are rejected
with an
ER_AGGREGATE_ORDER_FOR_UNION
error. Example:
SELECT 1 AS foo UNION SELECT 2 ORDER BY MAX(1);
UNION Restrictions
In a UNION
, the
SELECT
statements are normal
select statements, but with the following restrictions: