MySQL SELECT语法(四)UNION语法详解
源自MySQL 5.7 官方手册:13.2.9.3 UNION Syntax
一、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=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);
在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=10 AND B=1)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2)
ORDER BY a LIMIT 10;
这里如果不使用括号,他们估计会被应用在最后一个SELECT子句上。
对UNION结果使用的ORDER BY,不能使用tb1_name.col_name形式的列引用。而是在第一个SELECT语句中提供列别名,并引用ORDER BY中的别名
此外,如果要进行排序的列拥有别名,则ORDER BY子句必须引用别名,而不是列名。下面的第一个条SQL会正常运行,但是第二条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。做法如下:
(SELECT 1 AS sort_col, col1a, col1b, ... FROM t1)
UNION
(SELECT 2, col2a, col2b, ... FROM t2) ORDER BY sort_col;
然后可以继续在ORDER BY后添加辅助排序列了,这意味着来自同一个SELECT语句的数据行按辅助排序行进行排序:
(SELECT 1 AS sort_col, col1a, col1b, ... FROM t1)
UNION
(SELECT 2, col2a, col2b, ... FROM t2) ORDER BY sort_col, col1a;
附加列也可以提供其他标识信息,例如表名的字符串。
在ORDER BY子句中使用聚合函数的UNION查询将被拒绝,并报出ER_AGGREGATE_ORDER_FOR_UNION错误。
MySQL SELECT语法(四)UNION语法详解的更多相关文章
- Solr系列五:solr搜索详解(solr搜索流程介绍、查询语法及解析器详解)
一.solr搜索流程介绍 1. 前面我们已经学习过Lucene搜索的流程,让我们再来回顾一下 流程说明: 首先获取用户输入的查询串,使用查询解析器QueryParser解析查询串生成查询对象Query ...
- 【转】MySQL用户管理及SQL语句详解
[转]MySQL用户管理及SQL语句详解 1.1 MySQL用户管理 1.1.1 用户的定义 用户名+主机域 mysql> select user,host,password from mysq ...
- (转)总结之:CentOS 6.5 MySQL数据库的基础以及深入详解
总结之:CentOS 6.5 MySQL数据库的基础以及深入详解 原文:http://tanxw.blog.51cto.com/4309543/1395539 前言 早期MySQL AB公司在2009 ...
- MYSQL之数据库初识、安装详解、sql语句基本操作
目录 MYSQL之数据库初识及安装详解 1.什么是数据库? 1.什么是数据?(data) 2.什么是数据库?(databases,简称DB) 2.为什要用数据库? 3.什么是数据库管理系统?(Data ...
- MySQL数据库使用mysqldump导出数据详解
mysqldump是mysql用于转存储数据库的实用程序.它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等.接下来通过本文给大家介绍MySQL数 ...
- MySQL数据库的各种存储引擎详解
原文来自:MySQL数据库的各种存储引擎详解 MySQL有多种存储引擎,每种存储引擎有各自的优缺点,大家可以择优选择使用: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB ...
- mysql数据库分区功能及实例详解
分区听起来怎么感觉是硬盘呀,对没错除了硬盘可以分区数据库现在也支持分区了,分区可以解决大数据量的处理问题,下面一起来看一个mysql数据库分区功能及实例详解 一,什么是数据库分区 前段时间写过一篇 ...
- (转载) Linux IO模式及 select、poll、epoll详解
注:本文是对众多博客的学习和总结,可能存在理解错误.请带着怀疑的眼光,同时如果有错误希望能指出. 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案 ...
- (转)Linux IO模式及 select、poll、epoll详解
本文为转载,并作了部门调整.修改. [原文出处:https://segmentfault.com/a/1190000003063859] 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么 ...
- MySql绿色版配置及使用详解
原文:MySql绿色版配置及使用详解 最近在做项目开发时用到了MySql数据库,在看了一些有关MySql的文章后,很快就上手使用了.在使用的过程中还是出现了一些问题,因为使用的是绿色免安装版的MySq ...
随机推荐
- awk、grep、sed
awk.grep.sed是linux操作文本的三大利器,也是必须掌握的linux命令之一.三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂.grep更适合单纯的查找或匹配文 ...
- Flutter移动电商实战 --(15)商品推荐区域制作
1.推荐商品类的编写 这个类接收一个List参数,就是推荐商品的列表,这个列表是可以左右滚动的. /*商品推荐*/ class Recommend extends StatelessWidget { ...
- linux简单命令6---挂载
- Windows下Tesseract-OCR的安装
可以去Github查看tesseract-ocr的信息:https://github.com/tesseract-ocr/tesseract 在写这篇随笔的时候(2018年8月21日)最新版本是3.0 ...
- Vue input 控件: 通过自定义指令(directive)使用正则表达式限制input控件的输入
前言: 网站中的input输入框使用非常广泛,因业务场景不同需要对输入框做合法性校验或限制输入,比如电话号码.邮件.区号.身份证号等.input框的不合法内容主要有两种方式处理:1.用户输入内容后,通 ...
- PowerShell ISE/文件名解析缺陷远程执行代码漏洞#RCE
基础信息 ID 1337DAY-ID- 32642 类型 zdt Reporter hyp3rlinx 修改后的 2019-05-03 00:00:00 描述 在调试包含数组括号作为文件名一部分的特制 ...
- dp[2019.5.25]_2
1.对于长度相同的2个字符串A和B,其距离定义为相应位置字符距离之和.2个非空格字符的距离是它们的ASCII码之差的绝对值.空格与空格的距离为0,空格与其他字符的距离为一定值k. 在一般情况下,字符串 ...
- QFramework 使用指南 2020(五):脚本生成(3)生成 Prefab
在上一篇,我们简单介绍了 ViewController 的嵌套实现. 在这一篇,我们学习 ViewController 脚本生成的最后一个功能,即:生成 Prefab. 实际上这个功能非常简单. 我们 ...
- Linux生成ssh密钥免密登录,允许/禁止密码登录,允许/禁止root远程登录,更改ssh端口
进入想要使用密钥登录的用户家目录 cd 或 cd ~ 执行密钥创建命令,不行可能需要下载openssh-server与openssh-client ssh-keygen -t rsa -P " ...
- vscode使用Chrome浏览器调试不好用,解决方法!!
1.如果你是刚下载vscode,那么你需要下载两个插件. 1. open in browser(在浏览器中查看,支持五大主流浏览器),下载并启用. 2. view-in-browser (在浏览器中查 ...