Mysql中UNION用法与排序

  最近也是在写项目中碰到的这个问题,需要将两个SELECT查询结果组合起来进行分组排序,想到了用union方法,用TP的union操作根本无法完成复杂的union操作,于是搜罗了一下,先说一下union的用法,在说一下TP中如何实现复杂的union操作。

  一、UNION 用法

  一 UNION语法

  SELECT ...

  UNION[ALL | DISTINCT]

  SELECT ...

  [UNION [ALL | DISTINCT]

  SELECT ...]

  UNION用于把来自许多SELECT语句的结果组合到一个结果集合中。

  列于每个SELECT语句的对应位置的被选择的列应具有相同的类型。(例如,被第一个语句选择的第一列应和被其它语句选择的第一列具有相同的类型。www.111cn.net)在第一个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不能使用包括表名称(也就是,采用tbl_name.col_name格式的名称)列引用。可以在第一个SELECT语句中提供一个列别名,并在ORDER BY中参阅别名,或使用列位置在ORDER BY中参阅列。(首选采用别名,因为不建议使用列位置。)

  另外,如果带分类的一列有别名,则ORDER BY www.111cn.nEt子句必须引用别名,而不能引用列名称。以下语句中的第一个语句必须运行,但是第二个会运行失败,出现在'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的分页显示.

代码如下
(
SELECT * FROM `blog`
WHERE top=1
ORDER BY created DESC
)
UNION
(
SELECT *
FROM `blog`
WHERE top = 0
ORDER BY created DESC
) LIMIT 2 , 3

  注:union要求联合的两个表所要查找的数据列要一样多,如果一个表中没有另一个表的字段,可以用NULL代替

  三,实例

  UNION

代码如下

select * from
(
select * from ...
union all
select * from ...
) aaa
order by aaa.xxx desc;

  中的UNION

  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
)
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;
分类:mysql数据库 时间:2012-01-01 人气:10
本文关键词:
分享到:

相关文章

  • MySQL中使用自定义变量 编写偷懒的UNION示例 2012-12-08

    以下是对MySQL中使用自定义变量,编写一个UNION的示例进行了详细的介绍,需要的朋友可以过来参考下 (参考自<<高性能MySQL>>) 假设有这样的需求:写一个UNION查询,其第一个子查询作为分支先执行,如果找到了匹配的行,则不再执行第二个分支的查询。 一般来说,我们可以写出这样的UNION查询: 复制代码 代码如下: select id from users where id=123456 union all select id from users_archiv

  • mysql---union的用法 2014-12-20

    union的作用很简单用来合并两条sql的结果集 语法: SQL1 UNION SQL2 现有一张价格表 要求:vc3Ryb25nPsfzs/a82yYjMjY2ODQ7tc3T2jIwMDC6zbzbJiMyNjY4NDu439PaMzAwMLXEyczGt6OssrvE3NPDb3K6zW5vdCBiZXR3ZWVuoa2hrWFuZDwvcD4KPHA+PHN0cm9uZz7LvMK3o7o8L3N0cm9uZz7O0sPHv8nS1M/Ix/Oz9rXN09oyMDAwtcTJzMa3t

  • 对mssql注射中union获取数据的一些研究 2012-04-09

    摘自零客网安 bloodsword 在注射的时候,access和mysql环境下,我们通常是通过union来获取数据的。但是遇到mssql环境,union很多时候都行不通,如果页面不报错,openrowset不可用,往往时候就只有暴力了。这样多不好,大家都是文明人,怎么可以用这么野蛮的手段呢?研究了一下,mssql中的union选择主要有以下几个方面的限制。 第一个是varchar/nvarchar和int类型的字段union到一起会强制转换出错。这个可以去看superhei大牛N久以前的文章,

  • 初步介绍MySQL中的集合操作 2015-01-22

      啥是集合操作?   通常来说,将联接操作看作是表之间的水平操作,因为该操作生成的虚拟表包含两个表中的列。而我这里总结的集合操作,一般将这些操作看作是垂直操作。MySQL数据库支持两种集合操作:UNION DISTINCT和UNION ALL。   与联接操作一样,集合操作也是对两个输入进行操作,并生成一个虚拟表。在联接操作中,一般把输入表称为左输入和右输入。集合操作的两个输入必须拥有相同的列数,若数据类型不同,MySQL数据库自动将进行隐式转换。同时,结果列的名称由左输入决定。   前期准备

  • 和我一起学PHP手工注入 2012-06-14

    作者:冰的原点[L.S.T] 看了这么多的ASP注入的,各位是不是已经厌倦了ASP方面的注入呢?呵呵,千万不能厌倦呀,只有不断的学习,才不会被别人甩很远的!那么今天就跟着我一起学习下PHP环境下的手工注入吧. 今天的网站是一韩国的站点,注入点我已经找到了,大家如果怕麻烦的话,可以用啊D找下注入点,其实啊D不仅能找出ASP环境下的注入点,而且PHP,ASPX以及JSP的都可以找出来的哦,截张图大家看下,如图1. 其实找注入点这种事对啊D来说还是很容易的,不过接下来的事就得靠我们自己的双手来进行了.

  • 网格WIFI注入泄露数万O2O商户信息和WIFI密码 2012-06-23

    网格 WIFI 有注入漏洞, 可以下载所有商户的信息, 登录后台, WIFI 密码等 某个 API URL 可以注入: http://portal.wangge.cc/api/index_v2.php?act=fetchsupinfo&gw_id=gw_yysx sqlmap identified the following injection points with a total of 0 HTTP(s) requests: --- Parameter: gw_id (GET) Ty

  • 某省福利彩票运营管理系统(getshell &amp; 威胁内网) 2012-07-19

    登录地址: http://218.28.234.10/ 后台存在post注入 等多处注入 sqlmap identified the following injection points with a total of 0 HTTP(s) requests: --- Place: POST Parameter: opID Type: error-based Title: MySQL >= 5.0 AND error-based - WHERE or HAVING clause Payloa

  • 使用Burpsuite辅助Sqlmap进行POST注入测试 2012-12-10

    我们在使用Sqlmap进行post型注入时,经常会出现请求遗漏导致注入失败的情况。 这里分享一个小技巧,即结合burpsuite来使用sqlmap,用这种方法进行post注入测试会更准确,操作起来也非常容易。 1. 浏览器打开目标地址http:// www.2cto.com /Login.asp 2. 配置burp代理(127.0.0.1:8080)以拦截请求 3. 点击login表单的submit按钮 4. 如下图,这时候Burp会拦截到了我们的登录POST请求 5. 把这个post请求复制为

  • ShopEx短信通系统sql注入(POST) 2013-01-09

    ShopEx无线营销系统,1400多个库 网站: http://live.shopex.cn/ 注入点 http://live.shopex.cn:80/index.php/passport/passport/sel_region (POST) 参数p_region_id sqlmap identified the following injection points with a total of 80 HTTP(s) requests: --- Place: (custom) POST Pa

Copyright (C) quwantang.com, All Rights Reserved.

趣玩堂 版权所有 京ICP备15002868号

processed in 0.107 (s). 10 q(s)