一、rowid 和rownum
1舌缤、rowid
rowid是ORACLE在讀取表中數(shù)據(jù)行時(shí)箕戳, 根據(jù)每一行數(shù)據(jù)的物理地址信息編碼而成的一個(gè)偽列。所以根據(jù)一行數(shù)據(jù)的rowid能 找到一行數(shù)據(jù)的物理地址信息国撵。從而快速地定位到數(shù)據(jù)行陵吸。
用于定位數(shù)據(jù)庫(kù)中一條記錄的一個(gè) 相對(duì)唯一地址值。
rowid是一個(gè)偽列介牙,它并不實(shí)際存在于表中壮虫。
--rowid相當(dāng)于對(duì)象的地址,在數(shù)據(jù)插入到表中時(shí)候已經(jīng)存在,rowid不是地址,根據(jù)地址轉(zhuǎn)換的
select ename,job,rowid from emp;
--要求:刪除重復(fù)記錄,一條記錄只保留一次
--思路:將所有記錄按照某種特定規(guī)律分組(相同的記錄為一組)环础,保留下每組中的一條記錄即可囚似,其他記錄刪除
--查詢要保留的數(shù)據(jù)
select * from emp where rowid in(select rowid from emp);
--查詢要?jiǎng)h除的數(shù)據(jù)
select * from emp where rowid not in(select rowid from emp);
--刪除數(shù)據(jù)
delete from emp where rowid not in(select rowid from emp);
2、rownum
分頁(yè)线得,結(jié)果集的序號(hào)從1開始
按照主鍵進(jìn)行排序 先排序再確定rownum
按照非主鍵排序谆构,先確定rownum再排序
select deptno,rownum from emp order by deptno;
select deptno,ename,rownum from emp order by empno;
select deptno,ename,rownum from emp order by ename;
--按照工資降序排序,找第三頁(yè)的數(shù)據(jù) 一頁(yè)顯示兩條
--正確寫法1
select ename, sal, rownum, m, n
from (select ename, sal, rownum m, n
from (select ename, rownum n, sal from emp order by sal desc))
where m >= 5
and m <= 6;
--易犯錯(cuò)誤寫法2
select ename, sal, rownum, n
from (select ename, rownum n, sal from emp order by sal desc)
where n >= 5
and n <= 6;
--注意此時(shí)語(yǔ)句執(zhí)行順序?yàn)閒rom -> where -> select ,寫法二中框都,ename不是主鍵
--因此此時(shí)rownum n 為先確定rownum再排序,為亂序呵晨,通過(guò)n篩選的記錄是錯(cuò)誤記錄魏保。
--正確寫法為篩選出記錄之后要重新確定rownum m,然后再通過(guò)m篩選得到正確結(jié)果
二、表連接
使用場(chǎng)景:當(dāng)我們獲取的數(shù)據(jù)不是來(lái)自于同一張表而是來(lái)自于多張表時(shí)就需要使用到表連接
1摸屠、92語(yǔ)法
笛卡爾積
--笛卡爾積 emp中有12條記錄谓罗,dept表中有4條記錄,則最終查詢記錄為48條記錄
select * from emp,dept;
等值連接(在笛卡爾積基礎(chǔ)上 取條件列相同的值)
--等值連接 可以使相同字段 也可以是不同字段季二,但是要保證兩個(gè)字段的數(shù)據(jù)類型相同
select * from emp e,dept d where e.deptno=d.deptno;
--沒(méi)有滿足條件的數(shù)據(jù)
select * from emp e,dept d where e.ename=d.dname;
--字段數(shù)據(jù)類型不一致會(huì)報(bào)錯(cuò)
select * from emp e,dept d where e.ename=d.deptno;
非等值連接( > < != <>between and )
--非等值連接
--薪資2500的等級(jí)信息
select * from salgrade s where 2500 between s.losal and s.hisal;
--查詢所有員工的信息以及工資等級(jí)信息
select * from salgrade s,emp e where e.sal between s.losal and s.hisal;
--查詢所有有上級(jí)的員工信息以及上級(jí)信息
select * from emp e1,emp e2 where e1.mgr=e2.empno;
自連接 特殊的連接,自己連接自己 也可以自外鏈接
--查詢所有有上級(jí)的員工信息以及上級(jí)信息
select * from emp e1,emp e2 where e1.mgr=e2.empno;
外連接
左外連接
右外連接
--查詢所有員工的信息及上級(jí)信息 假設(shè)e1是員工表 e2是上級(jí)表
--需求:想要期中的某張表中所有的數(shù)據(jù)全部展示,無(wú)論是否滿足等值連接條件 --外鏈接
--外連接:確認(rèn)主表(主表中的內(nèi)容會(huì)全部展示) +對(duì)面的表為主表,+所在的表為從表
-- 左外連接 ->主表在,的左邊叫做左連接
select * from emp e1,emp e2 where e1.mgr=e2.empno(+);
-- 右外連接 ->主表在,的右邊叫做左連接
select * from emp e2,emp e1 where e1.mgr=e2.empno(+);
--這個(gè)+號(hào)可以這樣來(lái)理解: + 表示補(bǔ)充檩咱,即哪個(gè)表有加號(hào),這個(gè)表就是匹配表胯舷。所以加號(hào)寫在右表刻蚯,左表就是全部顯示,故是左連接桑嘶。
--找出 所有部門的員工數(shù) 及部門名稱
select deptno,count(1) from emp group by deptno;
select d.deptno, d.dname, nvl(c, 0)
from dept d, (select deptno, count(1) c from emp group by deptno) e
where e.deptno(+) = d.deptno;
注意:同名列 非* 必須區(qū)分 數(shù)據(jù)源 炊汹、關(guān)系列、 過(guò)濾條件逃顶、字段
--注意:連表查詢最好使用別名指定字段來(lái)源讨便,因?yàn)槭褂玫淖侄问窃诙鄠€(gè)表中存在的
select e.deptno,d.deptno from emp e ,dept d;
2充甚、99語(yǔ)法
交叉連接
--交叉連接 cross join
select * from emp cross join dept;
等值連接
自然連接
using
--等值連接
-- 自然連接 natural join 內(nèi)部自動(dòng)查找同名字段|
-- 不能指定限定詞
select * from emp natural join dept;
-- using 連接 指定字段等值連接
select * from emp join dept using(deptno);
非等值連接
--非等值連接 join...on...(Inner join 內(nèi)連接)(也可以用來(lái)進(jìn)行等值連接)
--查詢10和30部門的員工的名稱,部門名稱,薪資,薪資等級(jí),上級(jí)名稱
select e.ename,e.deptno,d.dname,e.sal,s.grade,m.ename
from emp e
join dept d on e.deptno=d.deptno
join salgrade s on e.sal between s.losal and s.hisal
join emp m on m.empno=e.mgr
where e.deptno in(20,30);
外連接
--外連接
-- 左外連接 left join on
select * from emp e1 left join emp e2 on e1.mgr=e2.empno;
-- 右外連接 right join on
select * from emp e2 right join emp e1 on e1.mgr=e2.empno;