MySQLSELECT语法(四)UNION语法详解
源⾃MySQL 5.7 官⽅⼿册:
⼀、UNION语法
UNION⽤于将多个SELECT语句的结果合并到⼀个结果集中。
SELECT ...
UNION[ALL | DISTINCT]SELECT ...
[UNION [ALL | DISTINCT]SELECT ...]
将会使⽤第⼀个SELECT语句中的列名称作为返回结果的列名称。⽽且在每个SELECT语句的相应位置中列出的选定列应具有相同的数据类型。
如果相应SELECT列的数据类型不匹配,则UNION结果中列的类型和长度会考虑所有SELECT语句检索的值。⽰例如下:
mysql>SELECT REPEAT('a',1) UNION SELECT REPEAT('b',10);
/*
+---------------+
| REPEAT('a',1) |
+---------------+
| a |
| bbbbbbbbbb |
+---------------+
*/
UNION涉及到的SELECT语句有如下限制:
只有最后⼀个SELECT语句可以使⽤INTO OUTFILE,当然,全部UNION的结果会写到⽂件中去。
HIGH_PRIORITY在UNION语句中使⽤没有意义。因为对第⼀个SELECT使⽤,不产⽣什么影响。在其它的SELECT中使⽤,会报错。
UNION的默认会从结果中删除重复的⾏,所以DINSTINCT关键字⽤不⽤都⼀样。⽽ALL关键字就可以让结果包含所有符合条件的重复⾏。
可以在同⼀查询中混合使⽤UNION ALL和UNION DISTINCT。MySQL对此的处理策略是:⼀个DISTINCT UNION句覆盖它其左侧的任何ALL UINON句。
要将ORDER BY或LIMIT应⽤于单个SELECT,请将⼦句放在包含SELECT的括号内:
(SELECT a FROM t1 WHERE a=10AND B=1ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11AND B=2ORDER BY a LIMIT 10);
在5.7中,括号是必须的。
对UNION中的单个SELECT语句使⽤ORDER BY并不影响⾏在最终结果中出现的顺序,因为UNION默认⽣成⼀组⽆序⾏。因此,在此上下⽂中使⽤ORDER BY通常与LIMIT结合使⽤来获取⼀个⼦集。
如果在SELECT中没有LIMIT出现ORDER BY,它会被优化掉,因为它⽆论如何都不会产⽣任何影响。
若要对整个UNION的结果使⽤ORDER BY 或 LIMIT,使⽤括号把SELECT⼦句括起来,然后在最后⼀个SELECT⼦句后使⽤他们。如下:
(SELECT a FROM t1 WHERE a=10AND B=1)
UNION
(SELECT a FROM t2 WHERE a=11AND B=2)
ORDER BY a LIMIT 10;
这⾥如果不使⽤括号,他们估计会被应⽤在最后⼀个SELECT⼦句上。
对UNION结果使⽤的ORDER BY,不能使⽤l_name形式的列引⽤。⽽是在第⼀个SELECT语句中提供列别名,并引⽤ORDER BY中的别名
此外,如果要进⾏排序的列拥有别名,则ORDER BY⼦句必须引⽤别名,⽽不是列名。下⾯的第⼀个条SQL会正常运⾏,但是第⼆条
sql中union多表合并SQL会失败报错:Unknow 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语句添加⼀个附加(常数)列作为专门的排序列,并在最后⼀个SELECT后添加ORDER BY。做法如下:
(SELECT1AS sort_col, col1a, col1b, ... FROM t1)
UNION
(SELECT2, col2a, col2b, ... FROM t2) ORDER BY sort_col;
然后可以继续在ORDER BY后添加辅助排序列了,这意味着来⾃同⼀个SELECT语句的数据⾏按辅助排序⾏进⾏排序:
(SELECT1AS sort_col, col1a, col1b, ... FROM t1)
UNION
(SELECT2, col2a, col2b, ... FROM t2) ORDER BY sort_col, col1a;
附加列也可以提供其他标识信息,例如表名的字符串。
在ORDER BY⼦句中使⽤聚合函数的UNION查询将被拒绝,并报出ER_AGGREGATE_ORDER_FOR_UNION错误。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论