本篇文章主要介绍使用Union
操做符将多个SELECT
查询组合成一个结果集。本文参考《Mysql
必知必会》+工做实践融合mysql
在大多数开发中,使用一条SELECT
查询就会返回一个结果集。若是,咱们想一次性查询多条SQL语句,并将每一条SELECT
查询的结果合并成一个结果集返回。就须要用到Union
操做符,将多个SELECT
语句组合起来,这种查询被称为并(Union
)或者复合查询。sql
组合查询适用于下面两种情境中:数据库
从多个表中查询出类似结构的数据,而且返回一个结果集segmentfault
从单个表中屡次SELECT
查询,将结果合并成一个结果集返回。函数
咱们经过一个简单的示例来认识一下Union
组合查询。post
建立一个用户表spa
首先分两次查询用户表,而后再组合查询3d
select user_id,user_nickname,user_status from yy_user where user_status = 1 // 第一次查询
select user_id,user_nickname,user_status from yy_user where user_id > 3 // 第二次查询
第一条SQL
查询了user_status=1
的用户,第二条查询了user_id > 3
的用户code
下面咱们组合这两条SQL
语句:blog
select user_id,user_nickname,user_status from yy_user where user_status = 1 UNION select user_id,user_nickname,user_status from yy_user where user_id > 3
这条语句由前面的两条语句组成,经过Union
组合了两条SELECT
,而且把结果集合并后输出。这条组合查询也可使用同等where
语句来替代:
select user_id,user_nickname,user_status from yy_user where user_status = 1 or user_id > 3;
where
和Union
在多数状况下均可以实现相同的结果集。where
能够实现的语句必定可使用Union
语句来实现。可是反过来就不必定正确了,好比下面将会说到的去重和不去重。
另外,在单表中使用Union
比where
多条件查询较为复杂。而从多张表中获取数据,使用Union
会相对于简单些。
Union
有他的强大之处,详细介绍以前,首先明确一下Union
的使用注意规则。
Union
必须由两条或者两条以上的SELECT
语句组成,语句之间使用Union
连接。
Union
中的每一个查询必须包含相同的列、表达式或者聚合函数,他们出现的顺序能够不一致(这里指查询字段相同,表不必定同样)
列的数据类型必须兼容,兼容的含义是必须是数据库能够隐含的转换他们的类型
咱们观察一下上面两条语句,第一条SELECT
返回了2条数据;第二条SELECT
也返回了2条数据。
可是Union
最终的结果返回了3条数据,而不是4条。mysql
在查询结果集中帮咱们自动去除了重复的行(重复的行是李四),把两条李四合并了。
通常状况下这样结果是好的,可是若是须要的状况下,咱们可使用Union All
操做符来取消自动合并功能。
select user_id,user_nickname,user_status from yy_user where user_status = 1 UNION ALL select user_id,user_nickname,user_status from yy_user where user_id > 3
这一次mysql
没有帮咱们去除重复,在查询结果中,咱们也看到了两条重复的李四。
以前咱们说过where
和Union
的区别,这里Union All
能够返回重复的数据,就是where
子句完成不了的工做。
使用Union
组合查询时,只能使用一条order by
子句对结果集进行排序,并且必须出如今最后一条出现的SELECT
语句以后。由于`Union
不容许对于部分结果集进行排序,只能针对最终检索出来的结果集进行排序。
注意:因为在多表组合查询时候,可能表字段并不相同。因此,在对于结果集排序的时候须要使用检索出来的共同字段。
(select user_id,user_nickname,user_status from yy_user where user_status = 1) UNION ALL (select user_id,user_nickname,user_status from yy_user where user_id > 3) order by user_id desc
上面检索的字段user_id
必须存在于结果集中。
大型项目中数据常常分布在不一样的表,检索的时候须要组合查询出来。多表查询的时候,并不要求两个表彻底相同,只须要你检索的字段结构类似就能够。
咱们已经有一张user
表,假设搜索时候咱们须要将用户昵称和博客文章标题一同混合检索。
看下上面的posts
表,posts_name
和user_nickname
类型相同,而posts_id
和user_id
类型相同,post_status
和user_status
类型相同。尽管他们的名称不相同。
咱们能够这么来检索:
select posts_id,posts_name,posts_status from yy_posts UNION select user_id,user_nickname,user_status from yy_user
从上面的检索结果能看出,咱们将两个表的数据组合了起来。Union
检索遇到不一致的字段名称时候,会使用第一条SELECT
的查询字段名称,或者你使用别名来改变查询字段名称。
上一个例子中,咱们组合查询了user
表和posts
表。虽然结果混合在一块儿没有任何问题,可是当显示到页面的时候,咱们须要给用户和文章不一样的连接或者其余的区分。因此咱们必须肯定该条记录来自于哪张表,咱们能够添加一个别名来做为表名。
select posts_id,posts_name,posts_status,'users' as table_name from yy_posts UNION select user_id,user_nickname,user_status,'posts' as table_name from yy_user
注意SQL
语句中的'users' as table_name
。对应的是图片里的table_name
,就是咱们刚刚添加用于区别表的字段。
星空幻颖,严颖
我的主页:segmentfault
我的博客:地址 不过很久没有更新了,噗噗噗