Oracle知識(shí)點(diǎn)總結(jié)(二)

多表查詢:
笛卡爾積: 實(shí)際上是兩張表的乘積,但是在實(shí)際開發(fā)中沒有太大意義

 格式: select * from 表1,表2   
select * from emp;
select * from dept;

select * from emp, dept;

select * from emp e1, dept d1 where e1.deptno = d1.deptno;

內(nèi)聯(lián)接:
隱式內(nèi)聯(lián)接:
等值內(nèi)聯(lián)接: where e1.deptno = d1.deptno;
不等值內(nèi)聯(lián)接: where e1.deptno <> d1.deptno;
自聯(lián)接: 自己連接自己
顯示內(nèi)聯(lián)接:
select * from 表1 inner join 表2 on 連接條件
inner 關(guān)鍵字可以省略

select * from emp e1, dept d1 where e1.deptno <> d1.deptno;

--查詢員工編號(hào),員工姓名,經(jīng)理的編號(hào),經(jīng)理的姓名
select e1.empno,e1.ename,e1.mgr,m1.ename
from emp e1, emp m1 where e1.mgr= m1.empno;

--查詢員工編號(hào),員工姓名,員工的部門名稱,經(jīng)理的編號(hào),經(jīng)理的姓名
select e1.empno,e1.ename,d1.dname,e1.mgr,m1.ename
from emp e1, emp m1,dept d1 where e1.mgr= m1.empno and e1.deptno = d1.deptno;
--查詢員工編號(hào),員工姓名,員工的部門名稱,經(jīng)理的編號(hào),經(jīng)理的姓名,經(jīng)理的部門名稱
select e1.empno,e1.ename,d1.dname,e1.mgr,m1.ename,d2.dname
from emp e1, emp m1,dept d1,dept d2 
where 
 e1.mgr= m1.empno 
 and e1.deptno = d1.deptno
 and m1.deptno = d2.deptno ;

--查詢員工編號(hào),員工姓名,員工的部門名稱,員工的工資等級(jí),經(jīng)理的編號(hào),經(jīng)理的姓名,經(jīng)理的部門名稱
select e1.empno,e1.ename,d1.dname,s1.grade,e1.mgr,m1.ename,d2.dname
from emp e1, emp m1,dept d1,dept d2,salgrade s1 
where 
 e1.mgr= m1.empno 
 and e1.deptno = d1.deptno
 and m1.deptno = d2.deptno
 and e1.sal between s1.losal and s1.hisal ;

--查詢員工編號(hào),員工姓名,員工的部門名稱,員工的工資等級(jí),
經(jīng)理的編號(hào),經(jīng)理的姓名,經(jīng)理的部門名稱,經(jīng)理的工資等級(jí)
select e1.empno,e1.ename,d1.dname,s1.grade,e1.mgr,m1.ename,d2.dname,s2.grade
from emp e1, emp m1,dept d1,dept d2,salgrade s1,salgrade s2 
where 
 e1.mgr= m1.empno 
 and e1.deptno = d1.deptno
 and m1.deptno = d2.deptno
 and e1.sal between s1.losal and s1.hisal 
 and m1.sal between s2.losal and s2.hisal ;

-查詢員工編號(hào),員工姓名,員工的部門名稱,員工的工資等級(jí),經(jīng)理的編號(hào),經(jīng)理的姓名,經(jīng)理的部門名稱,
經(jīng)理的工資等級(jí)
--將工資等級(jí) 1,2,3,4 顯示成 中文的 一級(jí) 二級(jí) 三級(jí)...

select e1.empno,
   e1.ename,
   d1.dname,
   case s1.grade
     when 1 then '一級(jí)'
     when 2 then '二級(jí)'
     when 3 then '三級(jí)'
     when 4 then '四級(jí)'
     else
         '五級(jí)'
     end "等級(jí)",
   e1.mgr,
   m1.ename,
   d2.dname,
   decode(s2.grade,1,'一級(jí)',2,'二級(jí)',3,'三級(jí)',4,'四級(jí)','五級(jí)') "等級(jí)"
from emp e1, emp m1,dept d1,dept d2,salgrade s1,salgrade s2 
where 
 e1.mgr= m1.empno 
 and e1.deptno = d1.deptno
 and m1.deptno = d2.deptno
 and e1.sal between s1.losal and s1.hisal 
 and m1.sal between s2.losal and s2.hisal ;

--查詢員工姓名和員工部門所處的位置
select e1.ename,d1.loc from emp e1,dept d1 where e1.deptno = d1.deptno;

select * from emp e1 inner join dept d1 on e1.deptno = d1.deptno;

外連接: (標(biāo)準(zhǔn),通用寫法)
左外連接: left outer join 左表中所有的記錄,如果右表沒有對(duì)應(yīng)記錄,就顯示空
右外連接: right outer join 右表中的所有記錄,如果左表沒有對(duì)應(yīng)記錄,就顯示空
outer 關(guān)鍵字可以省略
Oracle中的外連接: (+) 實(shí)際上是如果沒有對(duì)應(yīng)的記錄就加上空值

select * from emp e1,dept d1 where e1.deptno = d1.deptno(+);      
select * from emp e1 left outer join dept d1 on e1.deptno = d1.deptno;
insert into emp(empno,ename) values(9527,'HUAAN');
select * from emp e1,dept d1 where e1.deptno = d1.deptno(+);

select * from emp e1 right outer join dept d1 on e1.deptno = d1.deptno;
select * from emp e1,dept d1 where e1.deptno(+) = d1.deptno;

子查詢: 查詢語句中嵌套查詢語句; 用來解決復(fù)雜的查詢語句
查詢最高工資的員工信息
單行子查詢: > >= = < <= <> !=
多行子查詢: in not in >any >all exists not exists

--查詢最高工資的員工信息 
--1.查詢出最高工資 --5000
select max(sal) from emp;
--2. 工資等于最高工資
select * from emp where sal = (select max(sal) from emp);
--查詢出比雇員7654的工資高,同時(shí)和7788從事相同工作的員工信息
--1.雇員7654的工資 1250
select sal from emp where empno = 7654;
--2.7788從事的工作 ANALYST
select job from emp where empno = 7788;
--3.兩個(gè)條件合并
select * from emp where sal > 1250 and job = 'ANALYST';

select * from emp where sal > (select sal from emp where empno = 7654) 
and job = (select job from emp where empno = 7788);

--查詢每個(gè)部門最低工資的員工信息和他所在的部門信息
--1.查詢每個(gè)部門的最低工資,分組統(tǒng)計(jì)
select deptno,min(sal) minsal from emp group by deptno;
--2.員工工資等于他所處部門的最低工資
select * 
from emp e1,
 (select deptno,min(sal) minsal from emp group by deptno) t1 
where e1.deptno = t1.deptno and e1.sal = t1.minsal; 
--3.查詢部門相關(guān)信息
select * 
from emp e1,
 (select deptno,min(sal) minsal from emp group by deptno) t1,
 dept d1 
where e1.deptno = t1.deptno and e1.sal = t1.minsal and e1.deptno = d1.deptno; 

內(nèi)聯(lián)接, 單行子查詢, 多行子查詢
in
not in
any
all
exists
通常情況下, 數(shù)據(jù)庫中不要出現(xiàn)null 最好的做法加上Not null
null值并不代表不占空間, char(100) null 100個(gè)字符

--查詢領(lǐng)導(dǎo)信息
--1.查詢所有經(jīng)理的編號(hào)
select mgr from emp;
select distinct mgr from emp;
--2.結(jié)果
select * from emp where empno in (select mgr from emp);

--查詢不是領(lǐng)導(dǎo)的信息
select * from emp where empno not in (select mgr from emp);
select * from emp where empno <>all(select mgr from emp);
--正確的寫法
select * from emp where empno not in (select mgr from emp where mgr is not null);

--查詢出比10號(hào)部門任意一個(gè)員工薪資高的員工信息  10 20 30
select * from emp where sal >any (select sal from emp where deptno = 10);

--查詢出比20號(hào)部門所有員工薪資高的員工信息 10 20 30
--1.20號(hào)最高工資 5000
select max(sal) from emp where deptno =20;
--2.員工信息
select * from emp where sal > (select max(sal) from emp where deptno =20); 

使用多行子查詢完成上面這題
--20號(hào)部門所有員工薪資 (800 2975 ...)
select sal from emp where deptno = 20;
--大于集合所有的
select * from emp where sal >all(select sal from emp where deptno = 20);

exists(查詢語句) : 存在的意思,判斷一張表里面的記錄是否存在與另外一張表中
當(dāng)作布爾值來處理:
當(dāng)查詢語句有結(jié)果的時(shí)候, 就是返回true
否則返回的是false
數(shù)據(jù)量比較大的時(shí)候是非常高效的

select * from emp where exists(select * from emp where deptno = 1234567);
select * from emp where 3=4;
select * from emp where exists(select * from emp where deptno = 20);

--查詢有員工的部門的信息
select * from dept d1 where exists(select * from emp e1 where e1.deptno = d1.deptno);

--找到員工表中工資最高的前三名(降序排序)

select * from emp order by sal desc;----錯(cuò)誤

rownum : 偽列, 系統(tǒng)自動(dòng)生成的一列, 用來表示行號(hào)
rownum是Oracle中特有的用來表示行號(hào)的, 默認(rèn)值/起始值是 1 ,在每查詢出結(jié)果之后,再添加1
rownum最好不能做大于號(hào)判斷,可以做小于號(hào)判斷
SQL執(zhí)行順序
from .. where ..group by..having .. select..rownum..order by

Select rownum,e1.* from emp e1;
--查詢r(jià)ownum大于2的所有記錄 ,
select rownum,e1.* from emp e1 where rownum > 2;  --沒有任何記錄

--查詢r(jià)ownum大于等于1的所有記錄 
select rownum,e1.* from emp e1 where rownum >=1;

--查詢r(jià)ownum < 6 的所有記錄
select rownum,e1.* from emp e1 where rownum < 6;
--rownum 排序
Select rownum,e1.* from emp e1 order by sal;

--找到員工表中工資最高的前三名
select e1.* from emp e1 order by sal desc;
--將上面的結(jié)果當(dāng)作一張表處理,再查詢
select rownum, t1.* from (select e1.* from emp e1 order by sal desc) t1;
--只要顯示前三條記錄
select rownum, t1.* from (select e1.* from emp e1 order by sal desc) t1 
where rownum < 4;

--找到員工表中薪水大于本部門平均薪水的員工
--1.分組統(tǒng)計(jì)部門平均薪水
select deptno,avg(sal) avgsal from emp group by deptno;
--2.員工工資 > 本部門平均工資
select * from emp e1,(select deptno,avg(sal) avgsal from emp group by deptno) t1 
where e1.deptno = t1.deptno and e1.sal > t1.avgsal;

關(guān)聯(lián)子查詢 , 非關(guān)聯(lián)子查詢

select * from emp e where sal > (select avg(sal) from emp e2 group by deptno having
 e.deptno=e2.deptno);

統(tǒng)計(jì)每年入職的員工個(gè)數(shù)

select hiredate from emp;
--只顯示年
select to_char(hiredate,'yyyy') from emp;
--分組統(tǒng)計(jì)
select  to_char(hiredate,'yyyy') yy,count(1) cc from emp group by 
to_char(hiredate,'yyyy');

select yy
from 
(select  to_char(hiredate,'yyyy') yy,count(1) cc from emp group by  
to_char(hiredate,'yyyy')) tt;

select case yy when '1987' then cc end
from 
(select  to_char(hiredate,'yyyy') yy,count(1) cc from emp group by 
to_char(hiredate,'yyyy')) tt;

select case yy when '1987' then cc end "1987"
from 
(select  to_char(hiredate,'yyyy') yy,count(1) cc from emp group by  
to_char(hiredate,'yyyy')) tt;
--去除行記錄中的空值
select sum(case yy when '1987' then cc end) "1987"
from 
(select  to_char(hiredate,'yyyy') yy,count(1) cc from emp group by    
to_char(hiredate,'yyyy')) tt;

--統(tǒng)計(jì)員工的總數(shù)
select sum(cc) "TOTAL"
from 
(select  to_char(hiredate,'yyyy') yy,count(1) cc from emp group by  
to_char(hiredate,'yyyy')) tt;

--將1987 和TOTAL 合并在一起
select
  sum(cc) "TOTAL",
  sum(case yy when '1987' then cc end) "1987"
from
  (select  to_char(hiredate,'yyyy') yy,count(1) cc from emp group by  
to_char(hiredate,'yyyy')) tt;

--顯示所有年份的結(jié)果
select
  sum(cc) "TOTAL",
  sum(case yy when '1980' then cc end) "1980",
  sum(case yy when '1981' then cc end) "1981",
  sum(case yy when '1982' then cc end) "1982",
  sum(case yy when '1987' then cc end) "1987"
from
  (select  to_char(hiredate,'yyyy') yy,count(1) cc from emp group by  
to_char(hiredate,'yyyy')) tt;

rowid : 偽列 每行記錄所存放的真實(shí)物理地址
rownum : 行號(hào) , 每查詢出記錄之后,就會(huì)添加一個(gè)行號(hào)

select rowid,e.* from emp e;

--去除表中重復(fù)記錄
create table p(
   name varchar2(10)
);

insert into p values('黃偉福');
insert into p values('趙洪');
insert into p values('楊華');

delete from p p1 where rowid > (select min(rowid) from p p2 where 
p1.name = p2.name);

rownum : 分頁查詢
在oracle中只能使用子查詢來做分頁查詢

--查詢第6 - 第10 記錄
select rownum, emp.* from emp;

select rownum hanghao, emp.* from emp;

select * from (select rownum hanghao, emp.* from emp) tt where 
tt.hanghao between 6 and 10;

集合運(yùn)算:
并集: 將兩個(gè)查詢結(jié)果進(jìn)行合并
交集
差集
所有的查詢結(jié)果可能不是來自同一張表,
emp 2000年
2017年 手機(jī) 詳細(xì)信息 emp2017

--并集運(yùn)算: union  union all
 union : 去除重復(fù)的,并且排序
    union all : 不會(huì)去除重復(fù)的

--工資大于1500,或者20號(hào)部門下的員工
select * from emp where sal > 1500 or deptno = 20;
select * from emp where sal > 1500
union
select * from emp where deptno = 20;

select * from emp where sal > 1500
union all
select * from emp where deptno = 20;

交集運(yùn)算: intersect
--工資大于1500,并且20號(hào)部門下的員工
select * from emp where sal > 1500;
select * from emp where deptno = 20;

select * from emp where sal > 1500
intersect
select * from emp where deptno = 20;

差集運(yùn)算: 兩個(gè)結(jié)果相減:minus
--1981年入職員工(不包括總裁和經(jīng)理)
--1981年入職員工
select * from emp where to_char(hiredate,'yyyy')='1981';

--總裁和經(jīng)理
select * from emp where job = 'PRESIDENT' or job = 'MANAGER';


select * from emp where to_char(hiredate,'yyyy')='1981'
minus
select * from emp where job = 'PRESIDENT' or job = 'MANAGER';

集合運(yùn)算中的注意事項(xiàng):
1.列的類型要一致
2.按照順序?qū)?br> 3.列的數(shù)量要一致,如果不足,用空值填充

select ename,sal from emp where sal > 1500
union
select ename,sal from emp where deptno = 20;
--列的類型不匹配
select ename,sal from emp where sal > 1500
union
select sal,ename from emp where deptno = 20;

--列的數(shù)量不匹配
select ename,sal,deptno from emp where sal > 1500
union
select ename,sal from emp where deptno = 20;

select ename,sal,deptno from emp where sal > 1500
union
select ename,sal,null from emp where deptno = 20;

select ename,sal,deptno from emp where sal > 1500
union
select ename,sal,66 from emp where deptno = 20;

select * from emp;
select * from dept;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子走诞,更是在濱河造成了極大的恐慌,老刑警劉巖妥曲,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異钦购,居然都是意外死亡檐盟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門押桃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來葵萎,“玉大人,你說我怎么就攤上這事唱凯∠弁” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵磕昼,是天一觀的道長卷雕。 經(jīng)常有香客問我,道長票从,這世上最難降的妖魔是什么漫雕? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮峰鄙,結(jié)果婚禮上浸间,老公的妹妹穿的比我還像新娘。我一直安慰自己吟榴,他們只是感情好魁蒜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吩翻,像睡著了一般梅惯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仿野,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天铣减,我揣著相機(jī)與錄音,去河邊找鬼脚作。 笑死葫哗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的球涛。 我是一名探鬼主播劣针,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼亿扁!你這毒婦竟也來了捺典?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤从祝,失蹤者是張志新(化名)和其女友劉穎襟己,沒想到半個(gè)月后引谜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡擎浴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年员咽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贮预。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贝室,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出仿吞,到底是詐尸還是另有隱情滑频,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布唤冈,位于F島的核電站峡迷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏务傲。R本人自食惡果不足惜凉当,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望售葡。 院中可真熱鬧看杭,春花似錦、人聲如沸挟伙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尖阔。三九已至贮缅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間介却,已是汗流浹背谴供。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留齿坷,地道東北人桂肌。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像永淌,于是被迫代替她去往敵國和親崎场。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 5.多表查詢 多表查詢 目的:從多張表獲取數(shù)據(jù) 前提:進(jìn)行連接的多張表中有共同的列 等連接 通過兩個(gè)表具有相同意義...
    喬震閱讀 1,235評(píng)論 0 0
  • 基本SELECT 語句 1.select 列名 from 表名eg. 2.null 空值 (是一種無效的遂蛀,未賦值的...
    趙小瑩閱讀 488評(píng)論 0 0
  • 坐在椅子上谭跨,頭抵在書桌上,一縷陽光照在身上,暖暖的螃宙,好愜意的正午驕陽蛮瞄! 辦公室里空空的只剩下她一人了,忙碌的三月總...
    淡漠a(chǎn)閱讀 349評(píng)論 0 1
  • 我“養(yǎng)”了一個(gè)“寵物” 叫白雪污呼,因?yàn)樗椎谩跋瘛毖┰7弧K鼊倎淼臅r(shí)候特別小就像一個(gè)彈力球那么大包竹,我用紙給它做了個(gè)窩燕酷,過...
    王思彤閱讀 113評(píng)論 0 0
  • 我最喜歡的一幅畫 很美很美 風(fēng)吹了在擺動(dòng)飄動(dòng) 原來是你穿著裙子 我最喜歡的一部電影 很長很長 人散鏡頭才慢慢聚焦 ...
    不像話的故事閱讀 179評(píng)論 0 0