在mysql数据库中UNION是联合查询了,它分UNION与UNION all了,那它们有什么区别怎么用呢,下面我来给各位同学详细道来吧.
最近也是在写项目中碰到的这个问题,需要将两个SELECT查询结果组合起来进行分组排序,想到了用union方法,用TP的union操作根本无法完成复杂的union操作,于是搜罗了一下,先说一下union的用法,在说一下TP中如何实现复杂的union操作.
一、UNION 用法,UNION语法如下:
- SELECT...
- UNION[ALL|DISTINCT]
- SELECT...
- [UNION[ALL|DISTINCT]
- SELECT...]
UNION用于把来自许多SELECT语句的结果组合到一个结果集合中,列于每个SELECT语句的对应位置的被选择的列应具有相同的类型,例如,被第一个语句选择的第一列应和被其它语句选择的第一列具有相同的类型,在第一个SELECT语句中被使用的列名称也被用于结果的列名称.
SELECT语句为常规的选择语句,但是受到如下的限定:
·只有最后一个SELECT语句可以使用INTO OUTFILE。
·HIGH_PRIORITY不能与作为UNION一部分的SELECT语句同时使用,如果您对第一个 SELECT指定了HIGH_PRIORITY,则不会起作用,如果您对其它后续的SELECT语句指定了HIGH_PRIORITY,则会产生语法错误.
如果您对UNION不使用关键词ALL,则所有返回的行都是唯一的,如同您已经对整个结果集合使用了DISTINCT。如果您指定了ALL,您会从所有用过的SELECT语句中得到所有匹配的行.
DISTINCT关键词是一个自选词,不起任何作用,但是根据SQL标准的要求,在语法中允许采用,在MySQL中,DISTINCT代表一个共用体的默认工作性质.
您可以在同一查询中混合UNION ALL和UNION DISTINCT。被混合的UNION类型按照这样的方式对待,即DISTINCT共用体覆盖位于其左边的所有ALL共用体。DISTINCT共用体可以使用UNION DISTINCT明确地生成,或使用UNION(后面不加DISTINCT或ALL关键词)隐含地生成。
如果您想使用ORDER BY或LIMIT子句来对全部UNION结果进行分类或限制,则应对单个地SELECT语句加圆括号,并把ORDER BY或LIMIT放到最后一个的后面。以下例子同时使用了这两个子句,代码如下:
- (SELECTaFROMtbl_nameWHEREa=10ANDB=1)UNION(SELECTaFROMtbl_nameWHEREa=11ANDB=2)ORDERBYaLIMIT10;
- (SELECTaFROMtbl_nameWHEREa=10ANDB=1)UNION(SELECTaFROMtbl_nameWHEREa=11ANDB=2)ORDERBYaLIMIT10;
这种ORDER BY不能使用包括表名称,也就是,采用tbl_name.col_name格式的名称,列引用,可以在第一个SELECT语句中提供一个列别名,并在ORDER BY中参阅别名,或使用列位置在ORDER BY中参阅列,首选采用别名,因为不建议使用列位置.
另外,如果带分类的一列有别名,则ORDER BY 子句必须引用别名,而不能引用列名称,以下语句中的第一个语句必须运行,但是第二个会运行失败,出现在'order clause'中有未知列'a'的错误,代码如下:
- (SELECTaASbFROMt)UNION(SELECT...)ORDERBYb;
- (SELECTaASbFROMt)UNION(SELECT...)ORDERBYa;
- ToapplyORDERBYorLIMITtoanindividualSELECT,placetheclauseinsidetheparenthesesthatenclosetheSELECT。
为了对单个SELECT使用ORDER BY或LIMIT,应把子句放入圆括号中,圆括号包含了SELECT,代码如下:
(SELECT a FROM tbl_name WHERE a=10 AND B=1 ORDER BY a LIMIT 10)UNION(SELECT a FROM tbl_name WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
二 实例扩展
union可以对同一个表的两次查询联合起来,这样做的益处也非常明显,比如在blog应用中,可以利用一条sql语句实现置顶blog和普通blog的分页显示,代码如下:
- (
- SELECT*FROM`blog`
- WHEREtop=1
- ORDERBYcreatedDESC
- )
- UNION
- (
- SELECT*
- FROM`blog`
- WHEREtop=0
- ORDERBYcreatedDESC
- )LIMIT2,3
注:union要求联合的两个表所要查找的数据列要一样多,如果一个表中没有另一个表的字段,可以用NULL代替.
三,实例,UNION,代码如下:
- select*from
- (
- select*from...
- unionall
- select*from...
- )aaa
- orderbyaaa.xxxdesc;