Documentation Home

13.2.9.3 UNION 子句

SELECT ...
UNION [ALL | DISTINCT] SELECT ...
[UNION [ALL | DISTINCT] SELECT ...]

UNION将多个SELECT语句的结果组合成一个结果集。

结果集列名和数据类型

结果集列名取自第一条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隐式 生成。UNIONDISTINCTALL

联合中的 ORDER BY 和 LIMIT

要将ORDER BYor LIMIT子句应用于 individual SELECTSELECT请将 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);

使用ORDER BYfor 单个 SELECT语句并不意味着行在最终结果中出现的顺序,因为UNION默认情况下会生成一组无序的行。因此,ORDER BY 在此上下文中通常与 结合使用 LIMIT来确定要为 检索的所选行的子集 SELECT,即使它不一定会影响这些行在最终 UNION结果中的顺序。如果ORDER BY没有出现LIMIT在 a 中 SELECT,它会被优化掉,因为它没有效果。

要使用ORDER BYor LIMIT子句对整个 UNION结果进行排序或限制,请将各个SELECT语句括起来并将ORDER BYor 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使用其列位置中引用该列。但是,不推荐使用列位置。)

此外,如果要排序的列有别名,则ORDER BY子句必须引用别名,而不是列名。以下语句中的第一个是允许的,但第二个语句会因 Unknown column 'a' in 'order clause'错误而失败:

(SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY b;
(SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY a;

要使UNION结果中的行由逐行检索的行集组成,请在每行 SELECT中选择一个附加列 SELECT用作排序列,并ORDER BY在最后一列之后添加对该列进行排序的SELECT

(SELECT 1 AS sort_col, col1a, col1b, ... FROM t1)
UNION
(SELECT 2, col2a, col2b, ... FROM t2) ORDER BY sort_col;

要另外维护单个结果中的排序顺序 ,请向子句 SELECT添加辅助列:ORDER BY

(SELECT 1 AS sort_col, col1a, col1b, ... FROM t1)
UNION
(SELECT 2, col2a, col2b, ... FROM t2) ORDER BY sort_col, col1a;

使用附加列还可以让您确定 SELECT每一行来自哪一列。额外的列也可以提供其他标识信息,例如指示表名的字符串。

联合限制

在 aUNION中, SELECT语句是普通的 select 语句,但有以下限制:

  • HIGH_PRIORITY在第一个 SELECT没有效果。 HIGH_PRIORITY在任何后续 SELECT产生语法错误。

  • 只有最后一条SELECT 语句可以使用INTO子句。但是,整个UNION 结果将写入INTO输出目标。