Mysql联合查询UNION和Order by同时使用报错问题的解决办法
发布时间:2024-01-12 18:44:35
因此,常常出现这样的错误
select * from [IND] where INDID>10
union
select * from [IND] where INDID<9
目前为止,还没有出现问
之后,也许有人会用到类似的查询
select * from [IND] where INDID>10 order by INDID desc
union
select * from [IND] where INDID<9 order by INDID desc
此时就出现问题了,数据库报错。问题就出在order by上
为什么呢?难道UNION和ORDER BY 不能同时存在?
union和 order by 当然是可以同时存在的
但是在使用union的时候,联合查询不仅仅是将数据集合合并
他并不是将每个子查询一个一个查询出来后联接在一起,数据库是将整段查询语句理解之后统一查询得到的是整个的数据集合
另外order by在一个数据集合查询里也只能出现一次并且出现在最后。
因此,在联合查询里,order by 要写在最后一个子查询之后,并且,该排序是对整个联合查询出来的结果集排序的,并不是只对最后一个子查询排序
select * from [IND] where INDID>10
union
select * from [IND] where INDID<9 order by INDID desc
这样就可以对我们联合查询出来的结果集进行整体排序,而不是只对最后一个子查询的结果集排序。
再做一个试验来更充分的说明这个问题
创建一个这样的查询
select * from [IND] where INDID=4
union
select * from [IND] where INDID=2
union
select * from [IND] where INDID=1
union
select * from [IND] where INDID=5
union
select * from [IND] where INDID=3
INDID是主键,在创建数据的时候,数据库里的顺序是12345
但是,实际上得到的结果是和数据库里数据排列的顺序一样的 12345 因此,可以得出结论,联合查询的结果是整个查询完成后得出的,而不是将子查询挨个完成后拼接的。 union select * from [IND] where INDID=2 order by INDID ASC/DESC 如果是这样,在普通的查询中,TOP是在ORDER BY之后执行的,那么 union select * from [IND] where INDID=2 order by INDID 答案是不可以。 虽然说在单句的查询中,TOP是在ORDER BY 之后执行,但是在联合查询中,这样写,TOP的作用域是在子查询里,因此TOP并没有对联合查询的结果集筛选,而只对它所写在的那条子查询里进行筛选,这就像是子查询里的WHERE语句一样,类似这样的筛选作用范围都是在子查询,不像ORDER BY 作用在整个联合查询。 用 rowcount 比起TOP来说,rowcount作为结果集截取置顶更加规范些,毕竟不是依靠查询语句,而是直接设置查询语句获得结果集的数目。 select * from [IND] where INDID=4 union union order by INDID ASC
如果联合查询只是但存的将查询结果联接在一起,那么我们得到的结果应该是:42153
select * from [IND] where INDID=4
union
select * from [IND] where INDID=1
union
select * from [IND] where INDID=5
union
select * from [IND] where INDID=3
这样就可以对整个联合结果集进行排寻了。
另外关于TOP?
select TOP 2 * from [IND] where INDID=4
union
select * from [IND] where INDID=1
union
select * from [IND] where INDID=5
union
select * from [IND] where INDID=3
这样是不是可以得到整个结果集排序后的最前面两条数据呢?
那么如何对联合查询进行 截取置顶N条数据的筛选呢? 很简单
set rowcount 2
select * from [IND] where INDID=1
union
select * from [IND] where INDID=2
select * from [IND] where INDID=3
形如以上查询语句。我们就可以做到对联合查询排序,并获得最上的两条数据了。
既然能利用order by 排序 和 并用rowcount截取集和数量,那么自然联合查询分页等其他应用也不在话下了


猜你喜欢
- 网站改版,如何改?如果只是设计、功能和栏目等的稍微变动,这些很简单,从技术 上说并没有多少难度。只是对于网站本身的发展来说,没有多大的作用,
- 引言做接口测试的时候,避免不了操作数据库。因为数据校验需要,测试数据初始化需要、一些参数化场景需要等。数据库操作框架设计这里主要操作mysq
- 如何准确地获得一个整数?当然可以,Format就是做这个的“专家”:function NumbersOnlyNoDecimals(
- Python import .pyd文件时会搜索sys.path列表中的路径运行import xxx.pyd1. 'ImportEr
- pytorch常用函数torch.randn()torch.randn(*sizes, out=None) → Tensor功能:从标准正态
- 1.函数array() 功能:创建一个数组变量 格式:array(list) 参数:list为数组变量中的每个数值列,中间用逗号间隔 例子:
- Python的装饰器可以实现在代码运行期间修改函数的上下文, 即可以定义函数在执行之前进行何种操作和函数执行后进行何种操作, 而函数本身并没
- 在代码中添加以下两行可以解决:torch.backends.cudnn.enabled = Truetorch.backends.cudnn
- 导语梦想还是要有的,万一实现了呢?!今天小编就来用代码实现自己专属的城市——特大都市:梦想小镇启航。
- C4.5算法使用信息增益率来代替ID3的信息增益进行特征的选择,克服了信息增益选择特征时偏向于特征值个数较多的不足。信息增益率的定义如下:
- 使用MySQL Administrator 登录,报错: Either the server service or the configur
- CSS3草案中定义了{opacity:来声明元素的透明度,这已经得到了大多数现代浏览器的支持,而IE则很早通过特定的私有属性filter来实
- Python的3.0版本,常被称为Python 3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。为了不带入过多的
- 本文实例讲述python调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件的方法,该程序采用python 2.7编写。主
- 本文实例为大家分享了python实现文件批量重命名,供大家参考,具体内容如下讲解1、库:os2、代码效果:对指定文件夹内所有文件重命名为1,
- 本文实例为大家分享了mysql备份脚本,供大家参考,具体内容如下#!/bin/bash#全备方式,一般在从机上执行,适用于小中型mysql数
- 朴素贝叶斯算法简单高效,在处理分类问题上,是应该首先考虑的方法之一。通过本教程,你将学到朴素贝叶斯算法的原理和Python版本的逐步实现。更
- 我就废话不多说了,还是直接看代码吧!import osimport timeimport mmapfilename = 'test.
- 准备篇:1、配置防火墙,开启80端口、3306端口说明:Ubuntu默认安装是没有开启任何防火墙的,为了服务器的安全,建议大家安装启用防火墙
- 1.概念百度百科:笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X &ti