oracle分组后伪列,Oracle伪列和伪表和分组函数(row_number,Rank)
oracle的偽列以及偽表
oracle系統(tǒng)為了實(shí)現(xiàn)完整的關(guān)系數(shù)據(jù)庫(kù)功能,系統(tǒng)專門提供了一組成為偽列(Pseudocolumn)的數(shù)據(jù)庫(kù)列,這些列不是在建立對(duì)象時(shí)由我們完成的,而是在我們建立時(shí)由Oracle完成的。Oracle目前有以下偽列:
一、偽列:
CURRVAL AND NEXTVAL 使用序列號(hào)的保留字
LEVEL 查詢數(shù)據(jù)所對(duì)應(yīng)的層級(jí)
ROWID 記錄的唯一標(biāo)識(shí)
ROWNUM 限制查詢結(jié)果集的數(shù)量
Rowid的概念:rowid是一個(gè)偽列,既然是偽列,那么這個(gè)列就不是用戶定義,而是系統(tǒng)自己給加上的。對(duì)每個(gè)表都有一個(gè)rowid的偽列,但是表中并不物理存儲(chǔ)ROWID列的值。不過你可以像使用其它列那樣使用它,但是不能刪除改列,也不能對(duì)該列的值進(jìn)行修改、插入。一旦一行數(shù)據(jù)插入數(shù)據(jù)庫(kù),則rowid在該行的生命周期內(nèi)是唯一的,即即使該行產(chǎn)生行遷移,行的rowid也不會(huì)改變。
ROWNUM是一個(gè)序列,是oracle數(shù)據(jù)庫(kù)從數(shù)據(jù)文件或緩沖區(qū)中讀取數(shù)據(jù)的順序。它取得第一條記錄則rownum值為1,第二條為2,依次類推。如果你用>,>=,=,between...and這些條件,因?yàn)閺木彌_區(qū)或數(shù)據(jù)文件中得到的第一條記錄的rownum為1,則被刪除,接著取下條,可是它的rownum還是1,又被刪除,依次類推,便沒有了數(shù)據(jù)。
二、偽表
DUAL 表
該表主要目的是為了保證在使用SELECT語句中的語句的完整性而提供的。
一般用于驗(yàn)證函數(shù)。例如:
select sysdate,to_char(sysdate,'yyyy-mm-dd HH24:mm:ss') from dual
oracle的幾個(gè)偽列函數(shù)
ORACLE有幾個(gè)函數(shù)專門用來產(chǎn)生偽列的,rownum,rowid,row_number(),rank,dense_rank,lan
1 Connect by 語句
該語句結(jié)合偽列rownum或level 可以產(chǎn)生一個(gè)結(jié)果集.
1.?基本用法:
產(chǎn)生1~~100之間的整數(shù)
Select rownum xh from dual connect by rownum<=100;
Select level xh from dual connect by level<=100;
2.?高級(jí)用法
2.1.產(chǎn)生所有漢字,漢字內(nèi)碼為:19968~~~40869之間
select t.* from(
select rownum xh,nchr(rownum) hz from dual
connect by rownum<65535
) t
where t.xh between 19968 and 40869
2 rownum按行的順序自動(dòng)增加產(chǎn)生
row_number() 給每個(gè)組內(nèi)的不同記錄進(jìn)行排號(hào)(分組可不設(shè))
select t.c_group,
t.c_code,
t.c_desc,
row_number() over(PARTITION BY c_group ORDER BY c_desc DESC) rn
from tp_dictionary t
where t.c_group in ('PPSJ001', 'PPSJ002');
3 Rank() 按并列情況跨越排序
select t.c_group,
t.c_code,
t.c_desc,
Rank() over( ORDER BY c_code ) rn
from tp_dictionary t
where t.c_group in ('PPGL001', 'PPSJ002');
4 Dense_Rank() 按并列情況排序,不跳躍
select t.c_group,
t.c_code,
t.c_desc,
Dense_rank() over( ORDER BY c_code ) rn
from tp_dictionary t
where t.c_group in ('PPGL001', 'PPSJ002');
5 Lag對(duì)列進(jìn)行偏移(下面是偏移2列)
select t.c_group,
t.c_code,
t.c_desc,
lag(c_code,2,null) over(PARTITION BY c_group ORDER
BY c_desc asc) rn
from tp_dictionary t
where t.c_group in ('PPGL001', 'PPSJ002');
總結(jié)
以上是生活随笔為你收集整理的oracle分组后伪列,Oracle伪列和伪表和分组函数(row_number,Rank)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: thinkphp v5.0.11漏洞_T
- 下一篇: java中的输入语句判断正负_在java