2、 ANY操作:一共分為三種形式:
◆ =ANY:功能與IN操作一樣
查詢 工資 與經(jīng)理們的工資 相同的 所有雇員信息
SELECT * FROM emp
WHERE sal =ANY(
SELECT sal FROM emp WHERE job='MANAGER' ) ;
◆ >ANY:比 子查詢返回的最小值 要大
查詢工資比經(jīng)理們之中的最低工資 要高的 所有雇員信息
SELECT * FROM emp
WHERE sal >ANY(
SELECT sal FROM emp WHERE job='MANAGER' ) ;
◆
查詢 工資 比經(jīng)理們之中的最高工資 要低的 所有雇員信息
SELECT * FROM emp
WHERE sal
SELECT sal FROM emp WHERE job='MANAGER' ) ;
3磅废、 ALL操作:一共分為兩種形式:
◆ >ALL:比 子查詢返回的最大值 要大
查詢 工資 比經(jīng)理們之中的最高工資 要高的 所有雇員信息
SELECT * FROM emp
WHERE sal >ALL(
SELECT sal FROM emp WHERE job='MANAGER' ) ;
◆
查詢 工資 比經(jīng)理們之中的最低工資 要低的 所有雇員信息
SELECT * FROM emp
WHERE sal
SELECT sal FROM emp WHERE job='MANAGER' ) ;
在實(shí)際的開發(fā)之中映穗,WHERE子句中,出現(xiàn)子查詢的幾率诈胜,是很高的豹障。
【在HAVING子句里面使用子查詢(次重點(diǎn))】
如果子查詢可以在HAVING子句里面出現(xiàn),那么焦匈,只有一種情況血公,子查詢返回的是單行單列數(shù)據(jù),并且需要進(jìn)行統(tǒng)計(jì)函數(shù)計(jì)算的時(shí)候缓熟。
范例:查詢出高于公司平均工資的職位名稱累魔、職位人數(shù)、平均工資
◆ 找出公司的平均工資
SELECT AVG(sal) FROM emp ;
◆ 以上的查詢返回的是單行單列够滑,一般返回單行單列的數(shù)據(jù)垦写,只會(huì)在WHERE或HAVING子句里面出現(xiàn),但依據(jù)此題的要求彰触,應(yīng)該是在HAVING子句里面使用梯投。
SELECT job, COUNT(empno), AVG(sal)
FROM emp
GROUP BY job
HAVING AVG(sal)>(
SELECT AVG(sal) FROM emp ) ;
在進(jìn)行HAVING操作的過程之中,子查詢返回的數(shù)據(jù)况毅,不會(huì)過于的復(fù)雜分蓖。
【在SELECT子句里面使用子查詢(了解)】
子查詢可以出現(xiàn)在SELECT子句里面,只不過尔许,大部分的開發(fā)者么鹤,如果不是萬不得已的時(shí)候,絕對(duì)不會(huì)這么去做的味廊。
范例:查詢每個(gè)雇員的編號(hào)午磁、姓名尝抖、職位、部門名稱
◆ 如果迅皇,按照以前學(xué)習(xí)的多表查詢昧辽,來做此題:
SELECT e.empno, e.ename, e.job, d.dname
FROM emp e, dept d
WHERE e.deptno=d.deptno ;
◆ 如果,在SELECT子句里面使用子查詢登颓,來做此題:
SELECT e.empno, e.ename, e.job,
( SELECT d.dname FROM dept d WHERE d.deptno=e.deptno )
FROM emp e ;
每當(dāng)有一行emp的數(shù)據(jù)出現(xiàn)搅荞,那么,就要查詢一次dept表框咙,等于是你用戶自己發(fā)出了一次的查詢指令咕痛,
但是,卻變?yōu)榱恕?+N”次查詢喇嘱,(如果emp表有100行數(shù)據(jù)茉贡,就會(huì)查詢100次dept表),這種操作者铜,一般不會(huì)有人去使用腔丧。
【在FROM子句里面使用子查詢(重點(diǎn))】
如果子查詢返回的結(jié)構(gòu)是多行多列的數(shù)據(jù),那么作烟,就相當(dāng)于是一張臨時(shí)表的形式愉粤,所以,可以直接在FROM子句里面使用拿撩,下面回顧一個(gè)原始的題目衣厘。
范例:查詢出每個(gè)部門名稱、位置压恒、部門人數(shù)
◆ 之前影暴,可以通過多表查詢,而后探赫,進(jìn)行多字段分組實(shí)現(xiàn):
SELECT d.dname, d.loc, COUNT(e.empno)
FROM emp e, dept d
WHERE e.deptno(+)=d.deptno
GROUP BY d.dname, d.loc ;
但是以上的功能坤检,也可以使用子查詢實(shí)現(xiàn)。
◆ 改善做法期吓,利用子查詢完成早歇。
● 查詢出部門的編號(hào)、名稱讨勤、位置箭跳,此查詢只需要dept一張表就夠了。
SELECT d.deptno, d.dname, d.loc FROM dept d ;
● 統(tǒng)計(jì)出每個(gè)部門的編號(hào)潭千、人數(shù)谱姓,此查詢只需要emp一張表就夠了。
SELECT deptno, COUNT(empno)
FROM emp GROUP BY deptno ;
● 通過以上的兩個(gè)查詢結(jié)果發(fā)現(xiàn)刨晴,可以在部門編號(hào)上屉来,找到聯(lián)系:
子查詢 的列名稱 不使用 別名 ( 會(huì)報(bào)錯(cuò) )
SELECT d.dname, d.loc, temp.COUNT(empno)
FROM dept d, (
SELECT deptno, COUNT(empno)
FROM emp
GROUP BY deptno ) temp
WHERE d.deptno=temp.deptno(+) ;
子查詢 的列名稱 使用 別名
SELECT d.dname, d.loc, temp.count
FROM dept d, (
SELECT deptno, COUNT(empno) count
FROM emp
GROUP BY deptno ) temp
WHERE d.deptno=temp.deptno(+) ;
● 利用NVL( )函數(shù)路翻,將null替換為0
SELECT d.dname, d.loc, NVL( temp.count , 0 )
FROM dept d, (
SELECT deptno, COUNT(empno) count
FROM emp
GROUP BY deptno ) temp
WHERE d.deptno=temp.deptno(+) ;
疑問? 發(fā)現(xiàn)多表查詢也可以實(shí)現(xiàn)統(tǒng)計(jì)茄靠,子查詢也能夠?qū)崿F(xiàn)統(tǒng)計(jì)茂契,那么,哪種方式好呢慨绳?
為了可以更好的解釋這個(gè)問題掉冶,假設(shè)將數(shù)據(jù)表中的數(shù)據(jù)擴(kuò)大100倍,即:此時(shí)假設(shè)emp表有1400條記錄脐雪,而dept表有400條記錄厌小。
◆ 使用多表查詢及分組統(tǒng)計(jì):
● emp表的1400條 × dept表的400條 = 560,000條記錄
◆ 使用子查詢:
● 子查詢的數(shù)據(jù)量:只使用emp的1400條記錄,最多返回400行統(tǒng)計(jì)結(jié)果战秋。
(因?yàn)殍笛牵硬樵儯前凑誩mp表中的部門編號(hào)deptno來進(jìn)行分組統(tǒng)計(jì)的脂信。
子查詢癣蟋,返回的是400個(gè)部門的部門編號(hào),和每個(gè)部門所對(duì)應(yīng)的雇員人數(shù)吉嚣。
所以,子查詢蹬铺,返回的是400行記錄尝哆。)
● 子查詢的返回?cái)?shù)據(jù)量400條 × dept表的400條 = 160,000條記錄
● 兩個(gè)操作,加在一起甜攀,最多只操作了:160,400條記錄秋泄。
在實(shí)際的工作之中,子查詢的主要目的是解決多表查詢所帶來的性能問題规阀,所以恒序,在開發(fā)之中,使用是最多的谁撼。
在編寫代碼的過程之中歧胁,我們很少直接去關(guān)注 多表查詢,但是厉碟,我們都會(huì)關(guān)注 子查詢喊巍,用 子查詢 來改善 多表查詢 所帶來的 笛卡爾積 過多的問題。
在FROM子句出現(xiàn)子查詢箍鼓,一般還有一種情況:
“在整個(gè)查詢語句之中崭参,需要使用到統(tǒng)計(jì)函數(shù),但是款咖,又無法直接去使用統(tǒng)計(jì)函數(shù)的時(shí)候何暮,可以先在FROM子句里面利用子查詢實(shí)現(xiàn)統(tǒng)計(jì)”奄喂。
【總結(jié)】
復(fù)雜查詢 = 簡單查詢 + 限定查詢 + 多表查詢 + 分組統(tǒng)計(jì)查詢 + 子查詢。
如果是子查詢海洼,首先考慮的一定是WHERE或FROM子句里面出現(xiàn)子查詢的操作跨新,像SELECT子句,幾乎是可以忽略掉的贰军,而HAVING子句出現(xiàn)子查詢玻蝌,只有在使用統(tǒng)計(jì)函數(shù)的時(shí)候,才會(huì)使用词疼。
子查詢俯树,最大的作用是: 解決多表查詢所帶來的笛卡爾積影響的性能問題。