Oracle中rownum、rowid、rowITeye - 千亿集团

Oracle中rownum、rowid、rowITeye

2019年03月28日13时24分45秒 | 作者: 傲菡 | 标签: 相同,记载,排名 | 浏览: 2776

首要来说一下rownum与rowid意义:

望文生义rownum便是行数/行号,而rowid便是编码/编号/仅有识别号,所以他是相似“AAAR8gAAEAAAAErAAK”的编号,留意他是没有先后次序的,也便是说他和数据入库时刻没有任何关系,打个比如:他就像磁盘、内存存储数据用的是16进制的地址相同。

他们都是伪列,能够了解成表中的一个列仅仅他们并不是你创立的。相同是伪列差异是什么呢?

rowid是你录入数据时有数据库主动为这条记载增加的仅有的18位编号是一个物理编号用于找到这条记载(趁便说一句这也是为什么数据优调的时分着重尽量运用rowid的原因),他是不会跟着查询而改动的 除非在表发作移动(比如表空间改变,数据导入/导出今后),才会发作改变。

rownum是依据sql查询后得到的成果主动加上去的,可是他却不遭到sql中order by排序的影响,由于他和rowid的次序相同是体系依照记载插入时的次序给记载排的号(次序的、无跳动)。 可是假设你想让rownum和order by相同的次序 那么能够运用子查询,形如:select rownum,t.* from (select * from 表空间名 order by 字段名) t  这样的话rownum便是依据该字段进行排序的编号了,为什么会这样呢,自己了解:rownum是依据表记载输出的行号,与挑选句子、排序句子都无关所以当用子查询时等于生成了一个表于是就依照这张表从1开端排序了。 相同,也能够用下面要提得到的剖析函数中的row_number() over(order by 需求排序的字段名)。

下面说说剖析函数row_number()、rank()、dense_rank()

ROW_NUMBER():
Row_number函数回来一个仅有的值,当碰到相同数据时,排名依照记载会集记载的次序顺次递加。 row_number()和rownum差不多,功用更强一点(能够在各个分组内从1开时排序),由于row_number()是剖析函数而rownum是伪列所以row_number()一定要over而rownum不能over。

RANK():
Rank函数回来一个仅有的值,除非遇到相同的数据,此刻一切相同数据的排名是相同的,一起会在最终一条相同记载和下一条不同记载的排名之间空出排名。rank()是跳动排序,有两个第二名时接下来便是第四名(相同是在各个分组内)。

DENSE_RANK():
Dense_rank函数回来一个仅有的值,除非当碰到相同数据,此刻一切相同数据的排名都是相同的。
dense_rank()是接连排序,有两个第二名时仍然跟着第三名。他和row_number的差异在于row_number是没有重复值的。

下面举个比如:
【1】测验环境:
SQL desc user_order;
Name Null? Type
-  
REGION_ID NUMBER(2)
CUSTOMER_ID NUMBER(2)
CUSTOMER_SALES NUMBER

【2】测验数据:
SQL select * from user_order order by customer_sales;
 REGION_ID CUSTOMER_ID CUSTOMER_SALES
 - 
 5 1 151162
 10 29 903383
 6 7 971585
 10 28 986964
 9 21 1020541
 9 22 1036146
 8 16 1068467
 6 8 1141638
 5 3 1161286
 5 5 1169926
 8 19 1174421
 7 12 1182275
 7 11 1190421
 6 10 1196748
 6 9 1208959
 10 30 1216858
 5 2 1224992
 9 24 1224992
 9 23 1224992
 8 18 1253840
 7 15 1255591
 7 13 1310434
 10 27 1322747
 8 20 1413722
 6 6 1788836
 10 26 1808949
 5 4 1878275
 7 14 1929774
 8 17 1944281
 9 25 2232703
30 rows selected.


【3】row_number()、rank()、dense_rank()这三个剖析函数的差异实例
SQL select region_id, customer_id, sum(customer_sales) total,
  2  rank() over(order by sum(customer_sales) desc) rank,
  3  dense_rank() over(order by sum(customer_sales) desc) dense_rank,
  4  row_number() over(order by sum(customer_sales) desc) row_number
  5  from user_order
  6  group by region_id, customer_id;

REGION_ID CUSTOMER_ID  TOTAL  RANK DENSE_RANK ROW_NUMBER
-
 
  8  18  1253840  11  11  11
  5  2  1224992  12  12  12
  9  23  1224992  12  12  13
  9  24  1224992  12  12  14
  10  30  1216858  15  13  15

30 rows selected.
请留意上面的绿色高亮部分,这儿生动的演示了3种不同的排名战略:

①关于第一条相同的记载,3种函数的排名都是相同的:12

②当呈现第二条相同的记载时,Rank和Dense_rank仍然给出相同的排名12;而row_number则顺延递加为13,顺次类推至第三条相同的记载

③当排名进行到下一条不同的记载时,能够看到Rank函数在12和15之间空出了13,14的排名,由于这2个排名实际上现已被第二、三条相同的记载占了。而Dense_rank则次序递加。row_number函数也是次序递加

比较上面3种不同的战略,咱们在挑选的时分就要依据客户的需求来确定了:

①假设客户就只需求指定数目的记载,那么选用row_number是最简略的,但有漏掉的记载的风险

②假设客户需求一切到达排名水平的记载,那么选用rank或dense_rank是不错的挑选。至于挑选哪一种则看客户的需求,挑选dense_rank或得到最大的记载。

本文转自:http://blog.csdn.net/tomatofly/article/details/5939045
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表千亿集团立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章