1.rownum與rowid
rownum :行數/行號.
在查詢語句中之使用於<,<=
rowid:編碼/編號/唯一識別號.
他們都是偽列,可以理解成表中的乙個列只是他們並不是你建立的。同樣是偽列區別是什麼呢?
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 需要排序的欄位名)。
2.分析函式row_number()、rank()、dense_rank()
建立測試資料:
create table test_20120213(
id number primary key,
name varchar2(30),
value number
);insert into test_20120213 values (1,'a1',1) ;
insert into test_20120213 values (2,'a1',1) ;
insert into test_20120213 values (3,'a2',2);
insert into test_20120213 values (4,'a3',3);
insert into test_20120213 values (5,'a4',4);
insert into test_20120213 values (6,'a4',5);
insert into test_20120213 values (7,'a5',6);
insert into test_20120213 values (8,'a1',2);
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是沒有重複值的。
例子:
select id,name,row_number() over (partition by name order by value) row_number,
rank() over (partition by name order by value) rank,
dense_rank() over (partition by name order by value) dense_rank
from test_20120213
結果:id name row rank dense_rank
1 a1 1 1 1
2 a1 2 1 1
8 a1 3 3 2
3 a2 1 1 1
4 a3 1 1 1
5 a4 1 1 1
6 a4 2 2 2
7 a5 1 1 1
oracle分析函式的使用
1.實現組資料的相加,如下列資料,以前的處理方法是在前台進行加總處理。如果用分析函式處理就直接在後台處理了。74pcs 74 4 pcs70 1pcs 69 4 pcs65 4pcs 61100 pcs161 4pcs 157 2 pcs155 2pcs 153 2 pcs151 2pcs 1492...
oracle中的分析函式的使用
之前進行資料統計時一直用的group by,各種子查詢,外鏈結等等。雖然知道分析函式卻用的不太多。最近對分析函式進行進一步的學習,整理一些學習成果。分析函式語法 analytic function over clause order by clause 例項 select ename 姓名,dept...
oracle分析函式
oracle分析函式 sql plus環境 1 group by子句 create test table and insert test data.create table students id number 15,0 area varchar2 10 stu type varchar2 2 sc...