mysql中的union操作(整理)
一、总结
一句话总结:
union两侧的字段数和字段类型要是一样的
union可以接多个
orderby和排序可以在最后的union组合之后
1、union简单实例?
SELECT country FROM Websites UNION SELECT country FROM apps ORDER BY country;
2、UNION和UNION ALL的区别是什么?
UNION 语句:用于将不同表中相同列中查询的数据展示出来;(不包括重复数据)
UNION ALL 语句:用于将不同表中相同列中查询的数据展示出来;(包括重复数据)
3、laravel中union使用实例?
query2中 union(query1)
$select_field=['comment_lessons.*','users.name','users.id','lessons.l_title','lessons.l_id']; //1、这是所有我发的,我回复的或者我评论的:这里我并不需要知道自己的信息 //这是我回复别人的 $lesson_comments_active=CommentLesson::where('cl_u_id',$u_id) ->leftJoin('users', 'comment_lessons.cl_to_u_id', '=', 'users.id') ->join('lessons', 'comment_lessons.cl_l_id', '=', 'lessons.l_id') ->select($select_field); //2、这是所有回复我的,我需要知道用户的信息 $lesson_comments=CommentLesson::where('cl_to_u_id',$u_id) ->join('users', 'comment_lessons.cl_u_id', '=', 'users.id') ->join('lessons', 'comment_lessons.cl_l_id', '=', 'lessons.l_id') ->union($lesson_comments_active) ->orderBy('cl_created_at','desc')->offset($offset)->limit($per_page_item_num) ->select($select_field)->get();
4、union重复的问题?
select一般不产生重复数据,所以默认不消除重复记录,需要消除使用select DISTINCT.消除重复
union大多数产生重复数据,默认是消除重复数据,使用union all 不消除重复数据
5、为什么在union在字句中排序没有意义?
对用户不可见:ORDER BY子句不能出现在由UNION操作组合的两个SELECT中。不管怎样,排序两个查询结果集并没有太多的意义,因为它们被直接加入到UNION操作中,对用户是不可见的。
字段未命名:因为由UNION操作生成的字段是没有命名的,ORDERBY子句必须按字段编号指定字段。
二、MySQL UNION 操作符(基础)
转自或参考:MySQL UNION 操作符
https://www.cnblogs.com/hetaoyuan/p/11616172.html">MySQL UNION 操作符
描述
MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。
语法
MySQL UNION 操作符语法格式:
SELECT expression1, expression2, ... expression_n FROM tables [WHERE conditions] UNION [ALL | DISTINCT] SELECT expression1, expression2, ... expression_n FROM tables [WHERE conditions];
参数
-
expression1, expression2, ... expression_n: 要检索的列。
-
tables: 要检索的数据表。
-
WHERE conditions: 可选, 检索条件。
-
DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。
-
ALL: 可选,返回所有结果集,包含重复数据。
演示数据库
下面是选自 "Websites" 表的数据:
mysql> SELECT * FROM Websites; +----+--------------+---------------------------+-------+---------+ | id | name | url | alexa | country | +----+--------------+---------------------------+-------+---------+ | 1 | Google | https://www.google.cm/ | 1 | USA | | 2 | 淘宝 | https://www.taobao.com/ | 13 | CN | | 3 | 菜鸟教程 | http://www.runoob.com/ | 4689 | CN | | 4 | 微博 | http://weibo.com/ | 20 | CN | | 5 | Facebook | https://www.facebook.com/ | 3 | USA | | 7 | stackoverflow | http://stackoverflow.com/ | 0 | IND | +----+---------------+---------------------------+-------+---------+
下面是 "apps" APP 的数据:
mysql> SELECT * FROM apps; +----+------------+-------------------------+---------+ | id | app_name | url | country | +----+------------+-------------------------+---------+ | 1 | QQ APP | http://im.qq.com/ | CN | | 2 | 微博 APP | http://weibo.com/ | CN | | 3 | 淘宝 APP | https://www.taobao.com/ | CN | +----+------------+-------------------------+---------+ 3 rows in set (0.00 sec)
SQL UNION 实例
下面的 SQL 语句从 "Websites" 和 "apps" 表中选取所有不同的country(只有不同的值):
实例:
SELECT country FROM Websites UNION SELECT country FROM apps ORDER BY country;
注释:UNION 不能用于列出两个表中所有的country。如果一些网站和APP来自同一个国家,每个国家只会列出一次。UNION 只会选取不同的值。请使用 UNION ALL 来选取重复的值!
SQL UNION ALL 实例
下面的 SQL 语句使用 UNION ALL 从 "Websites" 和 "apps" 表中选取所有的country(也有重复的值):
实例
SELECT country FROM Websites UNION ALL SELECT country FROM apps ORDER BY country; 执行以上 SQL 输出结果如下:
带有 WHERE 的 SQL UNION ALL
下面的 SQL 语句使用 UNION ALL 从 "Websites" 和 "apps" 表中选取所有的中国(CN)的数据(也有重复的值):
实例
SELECT country, name FROM Websites WHERE country='CN' UNION ALL SELECT country, app_name FROM apps WHERE country='CN' ORDER BY country;
执行以上 SQL 输出结果如下:
NION 语句:用于将不同表中相同列中查询的数据展示出来;(不包括重复数据)
UNION ALL 语句:用于将不同表中相同列中查询的数据展示出来;(包括重复数据)
使用形式如下:
SELECT 列名称 FROM 表名称 UNION SELECT 列名称 FROM 表名称 ORDER BY 列名称;
SELECT 列名称 FROM 表名称 UNION ALL SELECT 列名称 FROM 表名称 ORDER BY 列名称;
转载:https://www.runoob.com/mysql/mysql-union-operation.html
三、mysql中的union用法
转自或参考:mysql中的union用法 - 简书
https://www.jianshu.com/p/b8f7f122f8a4
UNION在mysql中被称为集合操作,操作类型分为两种:UNION DISTINCT 和 UNION ALL;注意:UNION和UNION DISTINCT是一样的功能。UNION功能为合并多个查询的结果并去重,UNION ALL的功能为合并多个查询的结果不去重。
集合操作时,两边的输入必须拥有相同的列数,如果数据类型不同的话,mysql会自动进行隐式转化 ;同时,结果列的名称由第一个查询的列的名称决定。下面看一下例子:
sql语句为:SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION SELECT 'abc' as a,'haha',4 FROM DUAL;结果是:
如果是:SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION ALL SELECT 'abc' as a,'haha',4 FROM DUAL;
如果两次查询的列个数不一致,如:SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION ALL SELECT 'abc' as a,'haha' FROM DUAL;
在多个列查询时,只要有一个列的数据不一致时,都是无法去重的;也就是去重是每个列的数据完全一致,比如:SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION DISTINCT SELECT 'abc' as a,'haha',5 FROM DUAL;
这几个例子可以看出UNION (DISTINCT) 与 UNION ALL的用法了吧,下面讲一下UNION (DISTINCT)的实现方式:
一:创建一张虚拟表;
二:对这张虚拟表的列添加唯一索引,即UNIQUE INDEX;
三:将结果插入虚拟表
四:返回虚拟表;
如何判断是否创建一个虚拟表,我们可以通过一下语句判断:
SHOW STATUS LIKE 'Created_tmp_tables';
SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION SELECT 'abc' as a,'haha',4 FROM DUAL;
SHOW STATUS LIKE 'Created_tmp_tables'; 结果是:
可见结果3比结果1多1,在操作第二个 UNION语句时创建了一个虚拟表;如果UNION创建了索引,插入会相对变慢
四、mysql 中union使用
转自或参考:mysql 中union使用
https://blog.csdn.net/csdn13257081409/article/details/79573500
1.
2.union重复的问题:
select一般不产生重复数据,所以默认不消除重复记录,需要消除使用select DISTINCT.消除重复
union大多数产生重复数据,默认是消除重复数据,使用union all 不消除重复数据
3.union 和order by
union不能两个子查询都是用order by,他并不是将每个子查询一个一个查询出来后联接在一起,数据库是将整段查询语句理解之后统一查询得到的是整个的数据集合,只能在最后一个查询语句后面加,或者使用select from(...union...) order by
select * from [IND] where INDID>10 union select * from [IND] where INDID<9 order by INDID desc
4.多个Union使用