【子查詢】
1丙曙、 子查詢的各個使用形式。
2其骄、 分析子查詢的主要意義亏镰。
實際上,對于整個的SQL語法而言拯爽,所有的組成索抓,就是幾個固定的查詢語句:SELECT、FROM毯炮、WHERE逼肯、GROUP BY、HAVING否副、ORDER BY汉矿。
而所謂的子查詢崎坊,指的就是备禀,在一個查詢里面繼續(xù)嵌套其他的查詢語句。如果非要給子查詢一個語法的話:
SELECT [ DISTINCT ] 分組字段 [別名],... | 統(tǒng)計函數(shù), (
SELECT [ DISTINCT ] 分組字段 [別名]曲尸,... | 統(tǒng)計函數(shù)
FROM 表名稱 [別名]赋续,表名稱 [別名],...
[ WHERE 過濾條件(s) ]
[ GROUP BY 分組字段另患,分組字段纽乱,... ]
[ HAVING 分組后的過濾條件 ]
[ ORDER BY 字段 [ ASC | DESC ],字段 [ ASC | DESC ]昆箕,... ] )
FROM 表名稱 [別名]鸦列,表名稱 [別名],... , (
SELECT [ DISTINCT ] 分組字段 [別名]鹏倘,... | 統(tǒng)計函數(shù)
FROM 表名稱 [別名]薯嗤,表名稱 [別名],...
[ WHERE 過濾條件(s) ]
[ GROUP BY 分組字段纤泵,分組字段骆姐,... ]
[ HAVING 分組后的過濾條件 ]
[ ORDER BY 字段 [ ASC | DESC ],字段 [ ASC | DESC ]捏题,... ] )
[ WHERE 過濾條件(s) (
SELECT [ DISTINCT ] 分組字段 [別名]玻褪,... | 統(tǒng)計函數(shù)
FROM 表名稱 [別名],表名稱 [別名]公荧,...
[ WHERE 過濾條件(s) ]
[ GROUP BY 分組字段带射,分組字段,... ]
[ HAVING 分組后的過濾條件 ]
[ ORDER BY 字段 [ ASC | DESC ]稚矿,字段 [ ASC | DESC ]庸诱,... ] ) ]
[ GROUP BY 分組字段,分組字段晤揣,... ]
[ HAVING 分組后的過濾條件 (
SELECT [ DISTINCT ] 分組字段 [別名]桥爽,... | 統(tǒng)計函數(shù)
FROM 表名稱 [別名],表名稱 [別名]昧识,...
[ WHERE 過濾條件(s) ]
[ GROUP BY 分組字段钠四,分組字段,... ]
[ HAVING 分組后的過濾條件 ]
[ ORDER BY 字段 [ ASC | DESC ]跪楞,字段 [ ASC | DESC ]缀去,... ] ) ]
[ ORDER BY 字段 [ ASC | DESC ],字段 [ ASC | DESC ]甸祭,... ] ;
在一個查詢語句之中缕碎,有可能會同時嵌套多個子查詢。對于子查詢的時候池户,給出幾個非官方的使用方法:
◆ WHERE子句:子查詢一般會返回單行單列咏雌、單行多列凡怎、多行單列數(shù)據(jù)。
◆ HAVING子句:子查詢會返回單行單列赊抖,同時表示要使用統(tǒng)計函數(shù)统倒。
◆ FROM子句:子查詢返回多行多列數(shù)據(jù)(表結(jié)構(gòu))。
◆ SELECT子句:返回單行單列氛雪,不過一般不使用房匆。
【在WHERE子句里面,使用子查詢(重點)】
WHERE子句的作用是报亩,進行數(shù)據(jù)行的篩選操作的浴鸿。
范例:查詢出低于公司 平均工資 的雇員信息
◆ 應(yīng)該先統(tǒng)計出公司的平均工資的數(shù)值。
SELECT AVG(sal) FROM emp ;
◆ 以上的查詢弦追,返回單行單列赚楚,可以作為WHERE子句的過濾條件使用。
SELECT * FROM emp
WHERE sal<(SELECT AVG(sal) FROM emp ) ;
范例:查詢出公司最早雇傭的雇員信息
◆ 使用MIN( )函數(shù)骗卜,找到最早的雇傭日期宠页,返回單行單列數(shù)據(jù)。
SELECT MIN(hiredate) FROM emp ;
◆ 如果返回單行單列數(shù)據(jù)寇仓,并且又不使用統(tǒng)計函數(shù)举户,在WHERE子句中出現(xiàn)。
SELECT * FROM emp
WHERE hiredate=(SELECT MIN(hiredate) FROM emp ) ;
除了返回單行單列的內(nèi)容之外遍烦,還可以返回單行多列俭嘁,此類的操作,一般不會經(jīng)常使用服猪。
范例:查詢與SCOTT從事同一工作供填,并且工資相同的雇員信息。
◆ 首先應(yīng)該知道SCOTT的工作和工資罢猪。
SELECT job, sal FROM emp WHERE ename='SCOTT' ;
◆ 需要有另外的雇員在職位和工資上近她,與SCOTT的完全相同,由于此時返回的是單行多列的內(nèi)容膳帕,所以需要使用( )進行描述粘捎。
SELECT * FROM emp
WHERE (job, sal)=(
SELECT job, sal FROM emp WHERE ename='SCOTT' )
AND ename<>'SCOTT' ;
如果說子查詢返回的內(nèi)容,是多行單列的話危彩,那么攒磨,就表示: 一個操作的數(shù)據(jù)范圍。所以汤徽,對于此類的判斷娩缰,在SQL語句之中,提供有三個操作符:IN(應(yīng))谒府、ANY(安你)拼坎、ALL噢梧奢。
1、 IN操作: 指的是與子查詢返回的內(nèi)容相同
查詢經(jīng)理們的工資
SELECT sal FROM emp WHERE job='MANAGER' ;
查詢 工資 與經(jīng)理們的工資 相同的 所有雇員信息
SELECT * FROM emp WHERE sal IN(
SELECT sal FROM emp WHERE job='MANAGER' ) ;
此過程演痒,與之前所學(xué)的IN操作,完全相同趋惨,唯一的區(qū)別在于鸟顺,之前學(xué)的IN的范圍內(nèi)容是自己設(shè)置的,而此時是通過子查詢而來的器虾。
那么讯嫂,既然有了IN操作,就一定會有NOT IN操作兆沙。
查詢工資與經(jīng)理們的工資不同的所有雇員信息
SELECT * FROM emp
WHERE sal NOT IN(
SELECT sal FROM emp WHERE job='MANAGER' ) ;
SELECT * FROM emp
WHERE NOT sal IN(
SELECT sal FROM emp WHERE job='MANAGER' ) ;
但是欧芽,如果使用的是NOT IN或者是NOT ... IN,新的問題就出現(xiàn)了葛圃,子查詢里面千扔,不能夠返回null。如果子查詢返回了null库正,那么曲楚,最終的查詢,不會有任何的結(jié)果出現(xiàn)褥符。
范例:子查詢返回了null
SELECT mgr FROM emp ;
SELECT * FROM emp WHERE empno NOT IN(
SELECT mgr FROM emp ) ;