Oracle子查詢:where/from/having子查詢
最新學訊:近期OCP認證正在報名中,因考試人員較多請盡快報名獲取最近考試時間,報名費用請聯系在線老師,甲骨文官方認證,報名從速!
我要咨詢一般情況下:
WHERE:子查詢一般只返回單行單列、多行單列、單行多列的數據;
FROM:子查詢返回的一般是多行多列的數據,當作一張臨時表出現。
HAVING:子查詢返回的一般是單行單列數據。
子查詢在 WHERE 中出現
1.返回 單行單列 數據
范例一: 查詢出工資比SMITH還要高的全部雇員信息
SELECT * FROM EMP WHERE sal>(SELECT sal FROM EMP WHERE ename='SMITH');
2.子查詢返回 單行多列 數據
以上所返回的是單行單列,但是在子查詢之中,也可以返回單行多列的數據,只是這種子查詢很少出現。
范例:查詢出emp表中 職位和薪資 與雇員 'SCOTT'的 職位和薪資 相同的雇員信息。
SELECT * FROM EMP WHERE (JOB,SAL)=(SELECT job,sal from emp where ename='SCOTT');
3.子查詢返回 多行單列 數據
如果現在的子查詢返回的是多行單列數據的話,這個時候就需要使用三種判斷符判斷了:IN、ANY、ALL;
IN 操作符
IN里面的范圍由子查詢指定。
案例:查詢雇員的工資等于在經理的工資的范圍內的雇員信息
SELECT * FROM EMP WHERE SAL IN (SELECT SAL FROM EMP WHERE JOB='MANAGER');
但是在使用IN的時候還要注意 NOT IN的問題,如果使用NOT IN操作,在子查詢之中,如果有一個內容是null,則不會查詢出任何的結果。
解決非空 問題,使用空判斷NVL。
SELECT * FROM EMP WHERE SAL IN (SELECT NVl(SAL,0) FROM EMP WHERE JOB='MANAGER');
ANY操作符:與每一個內容想匹配,有三種匹配形式
=ANY:功能與IN操作符是完全一樣的;
案例:查詢雇員的工資等于在經理的工資的范圍內的雇員信息
SELECT * FROM EMP WHERE SAL =ANY(SELECT NVl(SAL,0) FROM EMP WHERE JOB='MANAGER');
>ANY:比子查詢中返回記錄最小的還要大的數據;
案例:查詢雇員的工資比經理的工資高的雇員信息
SELECT * FROM EMP WHERE SAL >ANY(SELECT NVl(SAL,0) FROM EMP WHERE JOB='MANAGER');
案例:查詢雇員的工資比經理的工資低的雇員信息
SELECT * FROM EMP WHERE SAL
ALL操作符:與每一個內容相匹配,有兩種匹配形式:
需要注意的是:ALL 。(如果有一個內容是null,則不會查詢出任何的結果。)
>ALL:比子查詢中返回的最大的記錄還要大
案例:查詢雇員的工資比經理的任意一個工資高的雇員信息
SELECT * FROM EMP WHERE SAL >ALL(SELECT NVl(SAL,0) FROM EMP WHERE JOB='MANAGER');
案例:查詢雇員的工資比經理的任意一個工資低的雇員信息
SELECT * FROM EMP WHERE SAL
子查詢在 FROM 中出現
這個子查詢一般返回的是多行多列的數據,當作一張臨時表的方式來處理。
范例:查詢出每個部門的編號、名稱、位置、部門人數、平均工資
SELECT
d.DEPTNO 編號,
d.DNAME 名稱,
d.LOC 位置,
temp.c 部門人數,
temp.a 平均工資
FROM DEPT d, (SELECT
DEPTNO dno,
count(SAL) c,
avg(SAL) a
FROM EMP
GROUP BY DEPTNO) temp
WHERE d.DEPTNO = temp.dno;
子查詢在 HAVING 中出現(一般在條件判斷出現統計函數的時候才使用)
范例:查詢出職位的名稱、人數、平均薪資,且要求 職位平均薪資高于公司平均薪資的,查詢結果根據平均薪資降序排列。
SELECT
JOB 名稱,
count(ENAME) 人數,
avg(SAL) 平均薪資
FROM EMP
GROUP BY JOB
HAVING avg(SAL) > (SELECT avg(sal)
FROM EMP)
ORDER BY 平均薪資 DESC;