mysql中的union操做(整理)

mysql中的union操做(整理)

1、总结

一句话总结:

union两侧的字段数和字段类型要是同样的
union能够接多个
orderby和排序能够在最后的union组合以后

 

一、union简单实例?

SELECT country FROM Websites UNION SELECT country FROM apps ORDER BY country;

 

二、UNION和UNION ALL的区别是什么?

UNION 语句:用于将不一样表中相同列中查询的数据展现出来;(不包括重复数据)
UNION ALL 语句:用于将不一样表中相同列中查询的数据展现出来;(包括重复数据)

 

三、laravel中union使用实例?

query2中 union(query1)
$select_field=['comment_lessons.*','users.name','users.id','lessons.l_title','lessons.l_id']; //一、这是全部我发的,我回复的或者我评论的:这里我并不须要知道本身的信息 //这是我回复别人的
  $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); //二、这是全部回复个人,我须要知道用户的信息
  $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();

 

 

四、union重复的问题?

select通常不产生重复数据,因此默认不消除重复记录,须要消除使用select DISTINCT.消除重复
union大多数产生重复数据,默认是消除重复数据,使用union all 不消除重复数据

 

五、为何在union在字句中排序没有意义?

对用户不可见:ORDER BY子句不能出如今由UNION操做组合的两个SELECT中。无论怎样,排序两个查询结果集并无太多的意义,由于它们被直接加入到UNION操做中,对用户是不可见的。
字段未命名:由于由UNION操做生成的字段是没有命名的,ORDERBY子句必须按字段编号指定字段。

 

 

 

2、MySQL UNION 操做符(基础)

转自或参考:MySQL UNION 操做符
https://www.cnblogs.com/hetaoyuan/p/11616172.html">MySQL UNION 操做符html

 

描述

MySQL UNION 操做符用于链接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。mysql

语法

MySQL UNION 操做符语法格式:laravel

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: 要检索的列。sql

  • tables: 要检索的数据表。数据库

  • WHERE conditions: 可选, 检索条件。express

  • DISTINCT: 可选,删除结果集中重复的数据。默认状况下 UNION 操做符已经删除了重复数据,因此 DISTINCT 修饰符对结果没啥影响。app

  • ALL: 可选,返回全部结果集,包含重复数据。less


演示数据库

下面是选自 "Websites" 表的数据:post

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

 

3、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建立了索引,插入会相对变慢

 

 

4、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使用

相关文章
相关标签/搜索