sql排序

Oracle之Union与Union all的区别

落花浮王杯 提交于 2019-11-26 20:31:58
如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字。union(或称为联合)的作用是将多个结果合并在一起显示出来。 union和union all的区别是,union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复。 Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序; Union all:对两个结果集进行并集操作,包括重复行,不进行排序; Intersect:对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序; Minus:对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序。 下面以实例说明Union与Union all的区别: 1、首先创建一张jack表: SQL > create table jack 2 ( 3 id int primary key , 4 name varchar2 ( 30 ) not null , 5 score number not null 6 ); 表已创建。 QL > insert into jack values ( 1 , ' Aaron ' , 78 ); SQL > insert into jack values ( 2 , ' Bill ' , 76 ); SQL >

SQL优化34条

南笙酒味 提交于 2019-11-26 19:22:12
我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习、摘录、并汇总部分资料与大家分享! (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. (2) WHERE子句中的连接顺序.: ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. (3) SELECT子句中避免使用 ‘ * ‘: ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间 (4) 减少访问数据库的次数: ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等; (5) 在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200

order by与索引

别等时光非礼了梦想. 提交于 2019-11-26 16:28:19
ORDER BY 通常会有两种实现方法,一个是利用有序索引自动实现,也就是说利用有序索引的有序性就不再另做排序操作了。另一个是把结果选好之后再排序。 用有序索引这种,当然是最快的,不过有一些限制条件,来看下面的测试。 测试数据:student表有两个字段id ,sid ,id是主键。一共有20W条记录,id从1到200000,sid也是从1到200000的数据。 第一种情况 : order by的字段不在where条件也不在select中 select sid from zhuyuehua.student where sid < 50000 order by id; 第二种情况 : order by的字段不在where条件但在select中。 select id,sid from zhuyuehua.student where sid < 50000 order by id; 第三种情况 : order by的字段在where条件但不在select中。 select sid from zhuyuehua.student where sid < 50000 and id < 50000 order by id; 第四种情况 : order by的字段在where条件但不在select中。倒序排列 select sid from zhuyuehua.student where sid

row_number()over函数的使用(转)

人走茶凉 提交于 2019-11-26 15:42:57
(转) http://hi.baidu.com/122439049/blog/item/0c9c48131b2734d5f7039e13.html row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的).   与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪列rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码.   row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序).   rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内).   dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的 .   lag(arg1,arg2,arg3): arg1是从其他行返回的表达式 arg2是希望检索的当前行分区的偏移量。是一个正的偏移量,时一个往回检索以前的行的数目。 arg3是在arg2表示的数目超出了分组的范围时返回的值。 看几个SQL语句: 语句一: select row_number() over(order by sale/cnt desc) as

SQL语句书写技巧

我与影子孤独终老i 提交于 2019-11-26 11:28:40
SQL结构化查询字符串的改写,是实现数据库查询性能提升的最现实.最有效的手段,有时甚至是唯一的手段, 比如在不允许大幅度修改现有数据库结构的情况下。 通过优化SQL语句提高查询性能的关键是: ? 根据实际需求情况,建立合适的索引; ? 使用一切可能的方式去利用好索引,避免全表扫描; ? 尽量减少内存及数据I/O方面的开销 一. 建立索引 (一)建立"适当"的索引,是快速查询的基础。 索引( index )是除表之外另一重要的.用户定义的存储在物理介质上的数据结构。当根据索引码的值搜索数据 时,索引提供了对数据的快速访问。事实上,没有索引,数据库也能根据SELECT语句成功地检索到结果,但随 着表变得越来越大,使用"适当"的索引的效果就越来越明显。注意,在这句话中,我们用了"适当"这个词, 这是因为,如果使用索引时不认真考虑其实现过程,索引既可以提高也会破坏数据库的工作性能。 索引实际上是一种特殊的目录,SQL SERVER提供了两种索引: ? 聚集索引( clustered index ,也称聚类索引.簇集索引) 我们把这种正文内容本身就是一种按照一定规则排列的目录称为"聚集索引"。 例如: 汉语字典中按拼音查某一个字,就是使用"聚集索引",实际上,你根本用不着查目录,直接在字典正文里找, 就能很快找到需要的汉字(假设你知道发音)。 ? 非聚集索引(non clustered

Oracle 分组排序函数

放肆的年华 提交于 2019-11-26 02:41:44
项目需求:分组排序 1、要求取出按field1分组后,并在每组中按照field2排序; 2、根据要求取出1中已经分组排序好的前多少行的数据; 1.row_number() over() row_number()over(partition by col1 order by col2)表示根据col1分组,再分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。 (1,2,3,4,5.....) 2.rank() over() rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)(1,2,2,4,5...) 3.dense_rank() over() dense_rank()也是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的。(1,2,2,3,4,5....) 示例SQL代码: CREATEDATE ACCNO MONEY 2014/6/5 111 200 2014/6/4 111 600 2014/6/5 111 400 2014/6/6 111 300 2014/6/6 222 200 2014/6/5 222 800 2014/6/6 222 500 2014/6/7 222 100 2014/6/6 333 800 2014/6/7 333 500 2014/6/8 333