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