--註意:rownum和rowid只有Oracle有,其它資料庫是不支持的 select * from scott.dept;--查詢的結果稱為'結果集' --rownum 偽列 '結果集'中產生的序列--在下麵的結果集中deptno為20的rownum為2select rownum,deptno, ...
--註意:rownum和rowid只有Oracle有,其它資料庫是不支持的
select * from scott.dept;
--查詢的結果稱為'結果集'
--rownum 偽列 '結果集'中產生的序列
--在下麵的結果集中deptno為20的rownum為2
select rownum,deptno,dname,loc from scott.dept;
--在下麵的結果集中deptno為20,30的rownum分別為1,2
select rownum,deptno,dname,loc from scott.dept where deptno in(20,30);
--rownum=1 1條數據
select rownum,deptno,dname,loc from scott.dept where rownum = 1;
--rownum=2 0條數據
select rownum,deptno,dname,loc from scott.dept where rownum = 2;
--rownum<3 2條數據
select rownum,deptno,dname,loc from scott.dept where rownum < 3;
--rownum>0 4條數據
select rownum,deptno,dname,loc from scott.dept where rownum > 0;
--rownum>1 正常理解是3條數據,但是結果沒有
--沒有第一條偽列,就沒有後面的偽列,偽列是從1開始遞增有順序的
select rownum,deptno,dname,loc from scott.dept where rownum > 1;
/*
行的標識稱為欄位
列的標識稱為欄位名
Oracle對rownum的處理,
rownum是在得到結果集的時候產生的,用於標記結果集中結果順序的一個欄位,
這個欄位被稱為“偽數列”,也就是事實上不存在的一個數列。
它的特點是按“順序標記”,而且是“逐次遞增”的,
換句話說就是只有存在rownum=1的記錄,才可能存在rownum=2的記錄。
假設我們的查詢條件偽rownum=2,那麼在查詢出的第一條記錄的時候,
oracle標記此條記錄rownum為1,結果發現和rownum=2的條件不符,於是結果集為空。
*/
--在Oracle中,利用rownum分頁,mysql:limit,sql:server top
select empno,ename from scott.emp;
--查詢emp中第6-10條
--in結果集在6,10
select rownum,empno,ename from scott.emp where rownum in (6,10);
--between 結果集在6,7,8,9,10(oracle)
--沒有1,不能查詢結果
select rownum,empno,ename from scott.emp where rownum between 6 and 10;
--有1,能查到結果
select rownum,empno,ename from scott.emp where rownum between 1 and 10;
--當前頁面數 1 每頁顯示數 5
--利用子查詢
--between
select * from(
select rownum as tempid,empno,ename
from scott.emp
)t1
where t1.tempid between 6 and 10;
--in
select * from(
select rownum as tempid,empno,ename
from scott.emp
)t1
where t1.tempid in (6,10);
--練習:提取scott.dept中第3條-第4條記錄
select * from(
select rownum as tempid,empno,ename
from scott.emp
)t1
where t1.tempid between 3 and 4;
/*
oracle還提供了另外一個數列:rowid
rowid和rownum不同,一般說來每一行數據對應一個rowid,而且是固定而且唯一的.
在這一行數據存入資料庫的時候就確定了。可以理解成java對象中的記憶體地址.
可以利用rowid來查詢記錄,而且通過rowid查詢記錄是查詢速度最快的查詢方法.
(有誰能記住18位長度的rowid字元?)
rowid只有在表發生移動(比如表空間變化,數據導入/導出以後),才會發生變化。
*/
--查詢dept表的rowid
select rowid,deptno,dname,loc from scott.dept;
--查詢rowid=AAAMgxAAEAAAAAQAAA的行數據
select * from scott.dept where rowid = 'AAAMgxAAEAAAAAQAAA';
--面試題
--刪除重覆數據
select * from tb_test;
create table tb_test(
name varchar(18),
age number
);
insert into tb_test(name,age)values('tom',22);
insert into tb_test(name,age)values('jack',21);
insert into tb_test(name,age)values('tom',22);
insert into tb_test(name,age)values('alice',22);
insert into tb_test(name,age)values('tom',22);
insert into tb_test(name,age)values('scott',18);
insert into tb_test(name,age)values('scott',18);
--使用DISTINCT 過濾重覆的欄位
SELECT distinct name from tb_test
/*
重覆數據:tom 22[3] scott 18[2]
1.刪除所有重覆數據
2.刪除重覆數據,但是保留一條(保留最大的rowid或者最小)
*/
--1
DELETE FROM tb_test
--此處WHERE nam IN將會把在子查詢語句中所得到的name都刪除掉
WHERE name IN(
SELECT name
FROM tb_test
GROUP BY name
HAVING COUNT(name)>1
);
--保留一條
--1.通過創建臨時表(ddl語句操作,很快)
--註意:使用distinct這種方式只能適用於重覆數據是所有列
--當欄位比較多(name,age,sex,address,phone...),但是判斷重覆只是name和age欄位,如果是sex呢?就不能使用distinct了
create table tb_tmp as select distinct name,age from tb_test;
--清空表記錄
--截斷
truncate table tb_test;
--將臨時表中的數據插回來
insert into tb_test(name,age) select name,age from tb_tmp;
select * from tb_tmp;
--查看tom的rowid
select rowid,name,age from tb_test where name='tom' and age=22;
--這裡max使用min也可以
--把不在最大唯一rowid的按照name,age分組的數據刪除掉
delete from tb_test where rowid not in(
--查詢唯一rowid
--按照最大的rowid,name,age分組,這樣分組後的數據都具有唯一性,不在分組內的數據都應該被刪除掉
select MAX(rowid) from tb_test group by name,age
);
delete from tb_test where rowid not in
(
select MIN(rowin) from tb_test group by name,age
);