Oracle之查詢詳解

查詢是數(shù)據(jù)的一個重要操作梯影。用戶發(fā)送查詢請求,經(jīng)編譯軟件變異成二進制文件供服務(wù)器查詢,后返回查詢結(jié)果集給用戶四敞,查詢會產(chǎn)生一個虛擬表泛源,看到的是表形式顯示的結(jié)果,但結(jié)果并不真正的存儲忿危,每次執(zhí)行查詢只是從數(shù)據(jù)表中提取數(shù)據(jù)达箍,并按照表的形式顯示出來。

SELECT <列名>

FGROM <表名>

[WHERE <查詢條件表達式>]

[GROUP BY <分組表達式>]

[HAVING <分組查詢表達式>]

[ORDER BY <排序的列名> [ASC或DESC]]

group by

group by 用于對查詢的結(jié)果分組統(tǒng)計铺厨,通過對group by后面的名字進行分組后輸出結(jié)果缎玫。

select deptno,count(ename) from emp group by deptno;

統(tǒng)計公司每個部門的員工人數(shù)

select deptno,avg(sal),max(sal) from emp group by deptno;

顯示每個部門的平均工資和最高工資

select deptno,gender,count(ename) from emp group by deptno,gender;

按照性別統(tǒng)計各個部門人數(shù)//需要手動添加一個gender列,并添加屬性

group by后面還可以跟多列表示多列分組解滓,在多列分組時放前面的優(yōu)先分組赃磨。

group by 列名,列名

select count(*) as 人數(shù),deptno as 部門號,job 工作 from emp group by deptno,job order by deptno;

having

having 子句用于限制分組顯示結(jié)果,其只能和group by一起連用洼裤。在where中沒有辦法直接使用聚合函數(shù)邻辉,即sum avg等無法使用,所以引用了having逸邦,在having中可以使用這些函數(shù)恩沛。

select deptno,avg(sal) from emp group by deptno having avg(sal)<2000;

顯示工資低于2000的部門號和它的平均工資

select deptno as 部門號,count(*) as 人數(shù) from emp group by deptno having count(*)>4;

顯示部門人數(shù)大于4的部門

order by

order by 表示排序,后跟列名和排序方式缕减。如果什么都不加默認為升序雷客。ASC表示升序,DESC表示降序桥狡。

select empno,ename,sal from emp order by sal;

select empno,ename,sal from emp order by sal asc;

select empno,ename,sal from emp order by sal desc;

在Oracle中還可以設(shè)置多列排序

order by 列名1 升降,列名2 升降;

前面的為主要排序搅裙,后面的為次一級排序。

注:碰到自己與自己比較的情況下裹芝,不能用having部逮,可以創(chuàng)建一個新列。

select depton,count(deptno) from emp group by deptno having sal>avg(sal);

select emp.deptno,count(*) from emp,(select deptno,avg(sal) avgsal from emp group by deptno) a where emp.deptno=a.deptno and emp.sal>a.avgsal group by emp.deptno;

查詢每個部門中工資高于該部門平均工資的員工人數(shù)

注:如果select語句同時包含group by,having,order by,按group by,having,order by排序

分組和聚合一起使用嫂易,目的是為了統(tǒng)計信息兄朋。

where是為了from服務(wù)的,只能跟真實的字段怜械,用來篩選from子句中指定的操作所產(chǎn)生的行

group by 用來分組where子句的輸出

having 用來從分組的結(jié)果中篩選行

order by用來對篩選的結(jié)果進行排序

復(fù)雜查詢

(1)分組函數(shù):max min?avg sum count

max表示該列的最大值颅和,min表示該列的最小值,avg表示該列的平均值缕允,sum表示該列的和峡扩,count表示該列的行數(shù)。

注:分組函數(shù)(max障本、min教届、avg响鹃、count、sum)只能出現(xiàn)在選擇列表中having子句案训、order by子句买置、不能出現(xiàn)在where子句和group by子句中。

select max(sal),min(sal) from emp;

如何顯示所有員工最高工資和最低工資

select avg(sal),sum(sal) from emp;

顯示所有員工的平均工資和工資總和

select count(ename) from emp; //count用于計算行

計算共有多少員工

select ename,job from emp where sal=(select max(sal) from emp);

顯示工資最高的員工的名字强霎,工作崗位(max等沒辦法直接跟在where后面)

select ename,sal from emp where sale>(select avg(sal) from emp);

顯示工資高于平均員工信息

(2)多表查詢

多表查詢是指兩個和兩個以上的表或者是視圖的查詢堕义,在實際應(yīng)用中,當(dāng)查詢單個表不能滿足需求時脆栋,一般使用多表查詢。如:顯示sales部門位置和其員工的姓名洒擦,這種情況下需要使用到(dept表和emp表)椿争。

多表查詢的連接一般可以分為:內(nèi)連接、左外連接熟嫩、右外連接秦踪、全連接。

注:在使用多表查詢的時候每個表可以設(shè)置別名掸茅,如果表指定了別名椅邓,那么語句中所有語句必須使用別名,而不能再使用實際表名昧狮。且在寫屬性的時候如果屬性為其中一個表特有的屬性則不需要寫別名景馁,如果是兩個表都有則必須指定是哪一個表的哪個屬性格式為:表名.屬性名。

select 列名 from 表1 別名,表2 別名...

select d.loc,e.ename,e.job from emp e,dept d where e.deptno=d.deptno

注:e是emp的別名逗鸣,d是dept的別名合住。

但如果對表進行了操作則需要設(shè)置別名,如:查詢每個部門中工資高于該部門平均工資的員工人數(shù)撒璧。在其中有一個avg表透葛,這個表必須設(shè)置別名(提醒:如果僅有一個被修改的表,則可以不設(shè)置別名卿樱,但如果有多個表則必須設(shè)置別名)僚害。

select emp.deptno,count(*) from emp,(select deptno,avg(sal) avgsal from emp group by deptno) a where emp.deptno=a.deptno and emp.sal>a.avgsal group by emp.deptno;

內(nèi)連接

內(nèi)連接通過使用比較運算符來使每個表的通用列中的值匹配來組成一個新表,即:把兩個表中間共有的那些行拿出來進行連接繁调,如果某些行不是兩個表共有的萨蚕,則不進行連接。

select

from 表1

inner join 表2

on 匹配條件

select

from 表1 表2

where匹配條件

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

select emp.ename,emp.sal,dept.dname from emp,dept where emp.deptno=dept.deptno;

左外連接

左外連接與內(nèi)連接的區(qū)別是:設(shè)置左外連接的時候設(shè)置了主表和附表涉馁,主表在前门岔,附表在后。內(nèi)連接是將兩個表匹配的地方輸出出來烤送,而左外連接則是主表全寫寒随,附表一一對應(yīng),附表有則加上,沒有不寫妻往。

select

from 表1

left join 表2

on 匹配條件

select e.ename,e.job,d.loc from dept d left join emp e on d.deptno=e.deptno;

將dept表放在前面互艾,以dept表為主表,emp表做輔表進行鏈接

select e.ename,d.dname,d.loc from emp e left join dept d on e.deptno=d.deptno;

將emp表放在前面讯泣,是以emp表作為主表纫普,dept表作為輔表進行鏈接

右外連接

右外連接和左外連接基本相同只是右外連接的主表寫在后邊。

select

from 表1

right join 表2

on 匹配條件

select e.ename,d.loc from emp e right join dept d on e.deptno=d.deptno;

這個dept表放在后面好渠,以dept表為主表昨稼,emp做輔表進行鏈接

select dname,ename,sal from dept left join emp on dept.deptno=emp.deptno;

查詢每個部門下的員工的姓名,工資

全連接

全連接是在等值連接的基礎(chǔ)上將左表和右表的未匹配數(shù)據(jù)都加上拳锚,使用的關(guān)鍵字為full outer join或者full join假栓。

select

from 表1

full join 表2

on 匹配條件

select e.ename,d.loc from emp e full join dept d on e.deptno=d.deptno;

自連接

還有一種特殊情況即自連接,在Oracle中一個表無法與自己進行比較霍掺,所以當(dāng)需要自己表的兩個信息做比較的時候也需要使用連接來連接匾荆,即同一張表的連結(jié)查詢。

select a.ename 員工,b.ename 領(lǐng)導(dǎo) from emp a,emp b where a.mgr=b.empno;

select a.ename 員工,b.ename 領(lǐng)導(dǎo) from emp a left join emp b on a.mgr=b.empno;

(3)子查詢

子查詢是指嵌套在其他sql語句中的select語句杆烁,也叫嵌套查詢牙丽。sql語句執(zhí)行順序為從右到左執(zhí)行,所以在執(zhí)行查詢時會先執(zhí)行左側(cè)的子查詢后進行主查詢兔魂。

子查詢分為單行子查詢和多行子查詢烤芦,單行子查詢是指返回一行數(shù)據(jù)的子查詢語句,多行子查詢是指返回多行數(shù)據(jù)的查詢語句析校。子查詢還可以分為多列子查詢拍棕、多行子查詢、多列多行子查詢勺良。

在進行子查詢時如果內(nèi)部查詢不返回任何記錄绰播,則外部條件中字段DEPTNO與NULL比較永遠為假,也就是說外部查詢不返回任何結(jié)果尚困。

總結(jié)為:

單行子查詢是指子查詢只返回單列蠢箩、單行數(shù)據(jù)

多行子查詢是指返回單列多行數(shù)據(jù),都是針對單列而言的

多列子查詢則是指查詢返回多個列數(shù)據(jù)的子查詢語句

單行子查詢

where deptno = (單行數(shù)值)

多行子查詢

where deptno in ( 多行數(shù)值 )

多列子查詢:

where (job,deptno)=(select job,deptno from emp where ename='KING')

多列多行子查詢

where (job,deptno) in (select job,deptno from emp where ename='KING')

單行子查詢

在單行子查詢的外部查詢中可以使用=事甜、>谬泌、<、>=逻谦、<=掌实、<>等比較運算符。

內(nèi)部查詢返回的結(jié)果必須與外部查詢條件中字段(DEPTNO)相匹配邦马。

select ename from emp where deptno=(select deptno from emp where ename='SMITH');

查詢和SMITH部門相同的員工的名字

select ename,job,sal from emp where deptno=(select deptno from dept where dname='SALES');

查詢出銷售部(SALES)下面的員工姓名贱鼻,工作宴卖,工資

select emp.deptno,count(*) from emp,(select deptno,avg(sal) avgsal from emp group by deptno) a where emp.deptno=a.deptno and emp.sal>a.avgsal group by emp.deptno;

查詢每個部門中工資高于該部門平均工資的員工人數(shù)

多行子查詢

在WHERE子句中使用多行子查詢時,可以使用多行比較運算符(IN,ALL,ANY)邻悬。

IN:等于任何一個症昏。

ALL:和子查詢返回的所有值比較。例如:sal>ALL(1,2,3)等價于sal>3父丰,即大于所有肝谭。

ANY:和子查詢返回的任意一個值比較。例如:sal>ANY(1,2,3)等價于sal>1蛾扇,即大于任意一個就可以攘烛。

注:ANY運算符必須與單行比較運算符結(jié)合使用,并且返回行只要匹配子查詢的任何一個結(jié)果即可。

select ename,sal,deptno from emp where sal>any(select sal from emp where deptno=30);

如何顯示工資比部門30的任意一個員工的工資高的員工的姓名镀首、工資和部門號

還可以:select ename,sal,deptno from emp where sal > (select min(sal) from emp where deptno=30);

select ename,sal,deptno from emp where sal > all(select sal from emp where deptno=30);

顯示工資比部門30的所有員工的工資高的員工的姓名医寿、工資和部門號

select * from emp where job in(select job from emp where ename='MARTIN' or ename='SMITH');

查詢emp表中工作和MARTIN和SMITH工作相同的員工的信息

select ename,hiredate from emp where deptno=(select deptno from emp where ename='BLAKE') and ename<> 'BLAKE';

創(chuàng)建一個查詢,顯示與blake在同一部門工作的雇員的姓名和受雇日期蘑斧,black不包含在內(nèi)

select ename,sal,mgr from emp where mgr=(select empno from emp where ename='KING');

顯示被king直接管理的雇員的姓名以及工資

多列子查詢

多列子查詢和多行子查詢相同,只是使用多列子查詢的時候會有多列進行匹配须眷。

如何查詢與smith的部門和崗位完全相同的所有雇員

select ename,job,deptno from emp where (deptno,job)=(select deptno,job from emp where ename='SMITH');

select ename,job,deptno from emp where (deptno,job) in (select deptno,job from emp where ename='SMITH');

(4)集合運算

為了合并多個select語句的結(jié)果竖瘾,可以使用集合操作符號union,union all花颗,intersect捕传,minus。

union:該操作符用于取得兩個結(jié)果集的并集扩劝。當(dāng)使用該操作符時庸论,會自動去掉結(jié)果集中重復(fù)行

select ename,sal,job from emp where sal>2500 union select enmae,sal,job from emp where job='manager';

union all:該操作與union相似,但是它不會取消重復(fù)行棒呛,而且不會排序

select ename,sal,job from emp where sal>2500 union all select ename,sal,job from emp where job='manager';

intersect:使用該操作符用于取得兩個結(jié)果集的交集

select ename,sal,job from emp where sal>2500 intersect select ename,sal,job from emp where job='manager';

minus:使用該操作符用于取得兩個結(jié)果集的差集聂示,它只會顯示存在第一個集合中,而不存在第二個集合中的數(shù)據(jù)

select enmae,sal,job from emp where sal>2500 minus select ename,sal,job from emp where job='manager';

總結(jié)為集合運算就是將兩個或者多個結(jié)果集組合成一個結(jié)果集簇秒。

intersect ?交集 返回兩個查詢共有的記錄

union all ?并集 返回各個查詢的所有記錄鱼喉,包括重復(fù)的記錄

union ? ? ?交集 返回各個查詢的所有記錄,不包括重復(fù)的記錄

MINUS ? 補集 返回第一個查詢檢查出的記錄減去第二個查詢檢索出來的記錄之后剩余的記錄

注意:當(dāng)使用集合操作的時候趋观,查詢所返回的列數(shù)以及列的類型必須匹配扛禽,列名可以不同。

(1)Distinct關(guān)鍵字

在Oracle中皱坛,可能出現(xiàn)若干相同的情況编曼,那么可以用Distinct消除重復(fù)行

select distinct deptno from emp;

(2)多表查詢與單行子查詢可以實現(xiàn)相同的功能

查詢出銷售部(sales)下面的員工姓名,工作剩辟,工資

使用多表連接查詢的方法:

select dname,ename,job,sal from emp,dept where emp.deptno=dept.deptno and dname='SALES';

使用單行子查詢:

select ename,job,sal from emp where deptno=(select deptno from dept where dname='SALES');

(3)顯示高于自己部門平均工資的員工信息

分析:

1.找到所有部門的平均工資

select deptno,avg(sal) from emp group by deptno;

2.找到所有人的工資信息

select ename,sal,deptno from emp;

3.把兩個結(jié)果集使用多表連接組合組合起來

select * from emp,(select deptno,avg(sal) avgsal from emp group by deptno) damao where emp.deptno=damao.deptno;

4.去掉低于平均工資的那些數(shù)據(jù)即可:

select * from emp,(select deptno,avg(sal) avgsal from emp group by deptno) damao where emp.deptno=damao.deptno and sal>avgsal;

(4)emp表介紹

字段? ? ? ? ? ? ? 類型? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 描述

empno ? ? ? ? ?NUMBER(4) ? ? ? ? ? ? ? ? 表示雇員編號掐场,是唯一編號

ename ? ? ? ? ?VAECHAR2(10) ? ? ? ? ? 表示雇員姓名

job ? ? ? ? ? ? ? ?VARCHAR2(9) ? ? ? ? ? ? 表示工作職位

mgr ? ? ? ? ? ? ?NUMBER(4) ? ? ? ? ? ? ? ? 表示一個雇員的領(lǐng)導(dǎo)編號

hiredate ? ? ? DATE ? ? ? ? ? ? ? ? ? ? ? ? ? ?表示雇傭日期

sal ? ? ? ? ? ? ? NUMBER(7,2) ? ? ? ? ? ? ? 表示月薪往扔,工資

comm ? ? ? ? ?NUMBER(7,2) ? ? ? ? ? ? ? 表示獎金,或者稱為傭金

deptno ? ? ? ? NUMBER(2) ? ? ? ? ? ? ? ? 部門編號

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末刻肄,一起剝皮案震驚了整個濱河市瓤球,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌敏弃,老刑警劉巖卦羡,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異麦到,居然都是意外死亡绿饵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門瓶颠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拟赊,“玉大人,你說我怎么就攤上這事粹淋∥睿” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵桃移,是天一觀的道長屋匕。 經(jīng)常有香客問我,道長借杰,這世上最難降的妖魔是什么过吻? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮蔗衡,結(jié)果婚禮上纤虽,老公的妹妹穿的比我還像新娘。我一直安慰自己绞惦,他們只是感情好逼纸,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著济蝉,像睡著了一般樊展。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上堆生,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天专缠,我揣著相機與錄音,去河邊找鬼淑仆。 笑死涝婉,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蔗怠。 我是一名探鬼主播墩弯,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼吩跋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了渔工?” 一聲冷哼從身側(cè)響起锌钮,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎引矩,沒想到半個月后梁丘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡旺韭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年氛谜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片区端。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡值漫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出织盼,到底是詐尸還是另有隱情杨何,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布沥邻,位于F島的核電站危虱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏谋国。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一迁沫、第九天 我趴在偏房一處隱蔽的房頂上張望芦瘾。 院中可真熱鬧,春花似錦集畅、人聲如沸近弟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祷愉。三九已至,卻和暖如春赦颇,著一層夾襖步出監(jiān)牢的瞬間二鳄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工媒怯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留订讼,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓扇苞,卻偏偏與公主長得像欺殿,于是被迫代替她去往敵國和親寄纵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

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