Mysql中UNION⽤法与排序
发布:smiling 来源: PHP粉丝⽹  添加⽇期:2014-09-25 15:23:17 浏览:1359 评论:0 
在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放到最后⼀个的后⾯。以下例⼦同时使⽤了这两个⼦句,代码如下:
(SELECT a FROM tbl_name WHERE a=10 AND B=1)UNION(SELECT a FROM tbl_name WHERE a=11 AND B=2)ORDER BY a LIMIT 10;
(SELECT a FROM tbl_name WHERE a=10 AND B=1)UNION(SELECT a FROM tbl_name WHERE a=11 AND B=2)ORDER BY a LIMIT 10;
这种ORDER BY不能使⽤包括表名称,也就是,采⽤l_name格式的名称,列引⽤,可以在第⼀个SELECT语句中提供⼀个列别名,并在ORDER BY中参阅别名,或使⽤列位置在ORDER BY中参阅列,⾸选采⽤别名,因为不建议使⽤列位置.
另外,如果带分类的⼀列有别名,则ORDER BY ⼦句必须引⽤别名,⽽不能引⽤列名称,以下语句中
的第⼀个语句必须运⾏,但是第⼆个会运⾏失败,出现在’order clause’中有未知列’a’的错误,代码如下:
(SELECT a AS b FROM t) UNION (SELECT …) ORDER BY b;
(SELECT a AS b FROM t) UNION (SELECT …) ORDER BY a;
To apply ORDER BY or LIMIT to an individual SELECT, place the clause inside the parentheses that enclose the SELECT。
为了对单个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的分页显⽰,代码如下:
flash动画免费资源下载
(
SELECT * FROM blog
WHERE top=1
ORDER BY created DESC
)
UNION
(matlab编程与汽车仿真应用
SELECT *
FROM blog
WHERE top = 0
ORDER BY created DESC
navigator js)
LIMIT 2 , 3
注:union要求联合的两个表所要查的数据列要⼀样多,如果⼀个表中没有另⼀个表的字段,可以⽤NULL代替.
三,实例,UNION,代码如下:
select * from
标签textarea
(
select * from …
union all
select * from …
) aaa
order by desc;
UNION在进⾏表链接后会筛选掉重复的记录,所以在表链接后会对所产⽣的结果集进⾏排序运算,删除重复的记录再返回结果,实际⼤部分应⽤中是不会产⽣重复的记录,最常见的是过程表与历史表UNION,代码如下:
select * from gc_dfys union select * from ls_jg_dfys
这个SQL在运⾏时先取出两个表的结果,再⽤排序空间进⾏排序删除重复的记录,最后返回结果集,如果表数据量⼤的话可能会导致⽤磁盘进⾏排序.
MySQL中的UNION ALL
⽽UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。
从效率上说,UNION ALL 要⽐UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使⽤UNION ALL,代码如下:
select * from gc_dfys union all select * from ls_jg_dfys
解决mysql中union排序的问题:
关于union双向排序(mysql),⾥的朋友问了⼀个mysql查询的问题,需求是这样的,论坛希望在显⽰帖⼦列表时侯前三条是点击量最多的,即按点击次数查询,余下的按时间查询,实际就是两个union的排序都⽣效,Sql代码如下:
(select * from (select * from table order by colnum desc) a);
(select * from table order by colnum limit 0,2
mysql语句顺序
)excel函数不起作用
UNION (select * from (select * from table order by colnum desc) a);
估计很多⼈会有这个需求,代码如下:
SELECT *,1 as ord FROM women where status = 2 and title like ‘%2014%’ or title like ‘%%’ union (select *,2 as ord FROM women where status = 2 and keywords like ‘%2014%’ or keywords like ‘%%’) ORDER BY ord,id desc limit 0,15;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。