最近在加強(qiáng)oracle查詢(xún),在網(wǎng)上看到了一個(gè)不錯(cuò)的視頻,把學(xué)習(xí)筆記和大家分享一下
10年的霞山網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營(yíng)銷(xiāo)推廣的優(yōu)勢(shì)是能夠根據(jù)用戶(hù)設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整霞山建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“霞山網(wǎng)站設(shè)計(jì)”,“霞山網(wǎng)站推廣”以來(lái),每個(gè)客戶(hù)項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
oracle 子查詢(xún)的語(yǔ)法(即select語(yǔ)句的嵌套)
子查詢(xún)要注意的問(wèn)題:
1.子查詢(xún)語(yǔ)法中的小括號(hào)
2.子查詢(xún)的書(shū)寫(xiě)風(fēng)格
3.可以使用子查詢(xún)的位置:where ,select ,having,from
4.不可以在主查詢(xún)的group by 使用
5.from的子查詢(xún)
6.主查詢(xún)和子查詢(xún)可以不是同一張表
7.一般不在子查詢(xún)中使用排序,因?yàn)閷?duì)主查詢(xún)沒(méi)有意義,但在top-N分析順序,要排序
8.執(zhí)行順序:先執(zhí)行子查詢(xún),再執(zhí)行主查詢(xún),但相關(guān)查詢(xún)例外
9.單行子查詢(xún)只能使用單行子查詢(xún),多行子查詢(xún)使用多行子查詢(xún)(查詢(xún)結(jié)果多行)
10.子查詢(xún)null問(wèn)題
---------------------------------------------------------------------------------------------
(1).可以使用子查詢(xún)的位置:where ,select ,having,from
select(在select語(yǔ)句后面的查詢(xún)必需是單行子查詢(xún),即結(jié)果返回為1條)
SELECT EMPNO,ENAME,SAL,(SELECT JOB FROM EMP where empno=7839) from emp
2.having(查詢(xún)平均薪水大于30號(hào)部門(mén)最高薪水的部門(mén)平均薪水
select deptno,avg(sal)
from emp
group by deptno
having avg(sal) >(select max(sal)
from emp
where deptno=30)
3.from--后面是放一張表,或結(jié)果集(一條查詢(xún)語(yǔ)句),在from的子查詢(xún)可以看成一張新的表
select *
from (select empno,ename,sal,sal*12 from emp)
4.where
查詢(xún)工資比scott的員工
select * from emp where sal > (select sal
from emp
where ename='scott')
(2).主查詢(xún)和子查詢(xún)可以不是同一張表,只要子查詢(xún)返回的結(jié)果主查詢(xún)能夠使用就行
select * from emp
where deptno = (select deptno
from dept
where dname='sales') --也可以使用多表查詢(xún)(數(shù)據(jù)庫(kù)只需要請(qǐng)求一次,根據(jù)笛卡爾積的大小才能判斷哪種方法
--比較好
(3)一般不在子查詢(xún)中使用排序,因?yàn)閷?duì)主查詢(xún)沒(méi)有意義,但在top-N分析順序,要排序
查找員工工資高的前3名:
--rownum:oracle自動(dòng)加上的偽列,要得到偽列的值,必須在select語(yǔ)句中顯示的查詢(xún)出來(lái)
--rownum只能使用<,<=
--行號(hào)永遠(yuǎn)按照默認(rèn)的順序生成,不會(huì)隨著排序而變化
select rownum,empno,ename,sal
from(select * from emp order by sal desc)
where rownum<=3;
(4).執(zhí)行順序:先執(zhí)行子查詢(xún),再執(zhí)行主查詢(xún),但相關(guān)查詢(xún)例外
相關(guān)子查詢(xún):(對(duì)于外面的表有一個(gè)要求,即必須有一個(gè)別名),可以把主查詢(xún)中的值作為參數(shù)傳遞給子查詢(xún)
例:查詢(xún)員工表中薪水大于本部門(mén)的平均薪水,
select empno,ename,sal,(select avg(sal) from emp where deptno=e.deptno) salavg
from emp e
where sal >(select avg(sal) from emp where deptno=e.deptno)
(5).單行子查詢(xún)只能使用單行子查詢(xún),多行子查詢(xún)使用多行子查詢(xún)(查詢(xún)結(jié)果多行)
單行操作符:=,>,>=,<,<=,<>
多行操作符:in,any,all
查詢(xún)員工信息,職位為7566員工一樣,sal大于7588
select * from emp
where job =
(select job from emp where empno=7566 ) and
sal>(select sal from emp where empno=7588)
查詢(xún)工資最低的員工信息
select * from emp
where sal = (select min(sal) from emp);
查詢(xún)最低工資大于20號(hào)部門(mén)最低工資的部門(mén)號(hào)和部門(mén)的最低工資
select dept,min(sal) from emp
group by deptno
having min(sal) > (select min(sal) from emp
where deptno=20);
多行子查詢(xún):
select *
from emp
where deptno in (select * from dept where dname='sales' or dname='accounting')
還可以使用多表查詢(xún)
查詢(xún)工資比30號(hào)部門(mén)任意一個(gè)員工高的員工信息
select * from emp
where sal > any (select sal from emp where deptno=30)
--(select min(sal) from emp where deptno=30)
查詢(xún)工資比30號(hào)部門(mén)所有一個(gè)員工高的員工信息
select * from emp
where sal > all(select sal from emp where deptno=30)
--(select max(sal) from emp where deptno=30)
(6)子查詢(xún)null問(wèn)題
單行子查詢(xún)null問(wèn)題
select * from emp
where job =
(select job
from emp where ename='tom')
多行子查詢(xún)的null值問(wèn)題
查詢(xún)不是老板的員工
select * from emp
where emp not in (select mgr from emp )--如果子查詢(xún)出來(lái)的結(jié)果有null
只要集合中有null值,那么不能使用not in (可以使用in),因?yàn)閚ot in 相當(dāng)于<>all,(in等同于any)
<>null永遠(yuǎn)為假
正確的
select * from emp
where emp not in (select mgr from emp where mgr is not null )
----------------------------華麗麗的分割線(xiàn)--------------------------------------------------------
分頁(yè)查詢(xún)
select * from
(select rownum r ,e.* from
(select * from emp order by sal desc) e1 where rownum<=5)
where r>1