1. 程式人生 > >Oracle-數據偽列ROWNUM, ROWID

Oracle-數據偽列ROWNUM, ROWID

tab 重復數據 改變 做的 tin 根據 取出 條件 操作符

ROWNUM(行號)

根據每行數據進行的一個自動編號,這個編號是動態生成的,而不是固定的。查詢條件改變時,生成的動態編號也不一樣。

在Oracle中,ROWNUM可以做的事情:

1.取出第一行記錄(其他的行記錄不行)

SELECT ROWNUM, empno, ename, job, sal FROM emp WHERE ROWNUM = 1;
SELECT * FROM emp WHERE ROWNUM = 1;

2.取出前N行記錄

SELECT * FROM emp WHERE ROWNUM <= 5;

想要取出前N行記錄很簡單,但是實際操作中往往需要取出第N-M行記錄。

實例1:查詢emp表的6-10行記錄

SELECT *
FROM ( SELECT empno, ename, deptno, job, sal,comm, mgr, hiredate, rownum rn FROM emp WHERE rownum <=10) temp
WHERE rn > 5;

思路:先查詢前10行數據,經過查詢後,生成的 rownum 列可以作為篩選條件繼續查詢

以上的查詢過程可以看做是一個分頁的結構,當前頁 currenpage, 每一頁的數據行數為 linesize

如果要查詢某一頁的數據,則結構可以寫成

SELECT * 
FROM (SELECT 列,..., rownum rn FROM
表名稱 WHERE rownum <= page*linesize) WHERE rn > (page-1)*linesize;

ROWID(行ID)

AAAR3sAAEAAAACXAAA

對象編號:AAAR3s

保存文件編號:AAE

保存的塊號:AAAACX

保存行號:AAA

範例1:查詢ROWID

SELECT ROWID, empno, ename, job FROM emp;

範例2:利用ROWID找到記錄(任何情況下,都可以用ROWID找到唯一的一行記錄)

SELECT * FROM emp WHERE ROWID = AAAR3sAAEAAAACXAAH
;

實例2:將表中的重復數據刪除,只保存一條

STEP-1:復制一個dept表為mydept;

CREATE TABLE mydept AS SELECT * FROM dept;

STEP-2:給mydept表增加一些重復數據

INSERT INTO mydept(deptno,dname,loc) VALUES (10,ACCOUNTING,NEW YORK);
INSERT INTO mydept(deptno,dname,loc) VALUES (10,ACCOUNTING,NEW YORK);
INSERT INTO mydept(deptno,dname,loc) VALUES (10,ACCOUNTING,NEW YORK);
INSERT INTO mydept(deptno,dname,loc) VALUES (30,SALES,CHICAGO);
INSERT INTO mydept(deptno,dname,loc) VALUES (30,SALES,CHICAGO);

STEP-3:可以給數據分組,查詢出同樣的數據中最小的ROWID

SELECT deptno,dname,loc, min(rowid)
FROM mydept
GROUP BY deptno,dname,loc;

STEP-4:上面的查詢結果就是無重復項的所有數據,即不用刪除的數據,可以用NOT IN操作符進行篩選

DELETE FROM mydept
WHERE rowid NOT IN 
(SELECT min(rowid) FROM mydept GROUP BY deptno,dname,loc);

Oracle-數據偽列ROWNUM, ROWID