天天看點

Oracle-資料僞列ROWNUM, ROWID

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);      

轉載于:https://www.cnblogs.com/dododo70/p/10353551.html