SELECT ...
UNION [ALL | DISTINCT] SELECT ...
[UNION [ALL | DISTINCT] 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
隐式
生成。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);
使用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
使用其列位置中引用该列。但是,不推荐使用列位置。)
此外,如果要排序的列有别名,则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
每一行来自哪一列。额外的列也可以提供其他标识信息,例如指示表名的字符串。