Oracle-子查詢/復雜查詢實例
阿新 • • 發佈:2019-02-05
dna 單列 name pre min 需要 查詢語句 判斷 temp
子查詢的應用範圍:
WHERE: 一般返回單行單列,單行多列,多行單列
HAVING:子查詢如果出現在HAVING中,只有一種情況就是子查詢返回單行單列數據,且需要進行統計函數計算
FROM:返回多行多列(表結構)
SELECT:返回單行單列,較少使用
範例1:查詢低於公司平均工資的雇員信息
1. 先計算出平均工資: SELECT AVG(sal) FROM emp 2. 上面的查詢結果返回單行單列數據,可以用WHERE語句子查詢 SELECT * FROM emp WHERE sal < (SELECT AVG(sal) FROM emp);
範例2:查詢出公司最早雇傭的雇員信息
1. 查詢出最早的雇傭日期: SELECT MIN(hiredate) FROM emp 2. 返回單行單列數據,可用於WHERE子句 SELECT * FROM emp WHERE hiredate = (SELECT MIN(hiredate) FROM emp);
範例3:與 SCOTT 從事同一工作,且工資相同的雇員信息
1. 查詢出SCOTT的工作和工資 SELECT job, sal FROM emp WHERE ename = ‘SCOTT‘ 2.返回單行多列,可以用WHERE子句 SELECT * FROM emp WHERE (job, sal) = (SELECTjob, sal FROM emp WHERE ename = ‘SCOTT‘) AND ename <> ‘SCOTT‘;
子查詢如果返回多行多列的數據(表的形式),這類判斷一般有三個操作符(IN, ANY, ALL)
IN的用法:指的是與子查詢返回的內容相同
註:子查詢中不能返回 null,將不會有任何的查詢結果出現
SELECT * FROM emp WHERE sal IN (SELECT sal FROM emp WHERE job = ‘MANAGER‘);
=ANY操作:功能等於 IN
SELECT * FROM emp WHERE sal =ANY(SELECT sal FROM emp WHERE job = ‘MANAGER‘);
>ANY操作:大於子查詢結果的最小值
SELECT * FROM emp WHERE sal >ANY (SELECT sal FROM emp WHERE job = ‘MANAGER‘);
<ANY操作:小於子查詢結果的最大值
SELECT * FROM emp WHERE sal <ANY (SELECT sal FROM emp WHERE job = ‘MANAGER‘);
ALL操作之 >ALL:大於子查詢結果的最大值
ALL操作之 <ALL:大於子查詢結果的最小值
子查詢之HAVING:
範例1:查詢高於平均工資的職位名稱,職位人數,平均工資
1.寫子查詢語句,即確定平均工資 SELECT AVG(sal) FROM emp 2.要使用統計函數,所以只能在HAVING語句使用子查詢 SELECT job, count(empno), avg(sal) FROM emp
GROUP BY job HAVGING SELECT AVG(sal) FROM emp;
子查詢之FROM:
範例1:查詢出每個部門名稱,位置,部門人數
1. 確定要使用的數據表: emp, dept 2. 查詢部門編號,名稱,位置只需要dept表 SELECT deptno, dname, loc FROM dept; 3. 查詢部門編號,人數,只需要emp表 SELECT deptno, count(empno) FROM emp GROUP BY deptno; 4.返回的數據可以在deptno這個字段上找到聯系 SELECT d.dname, d.loc, temp.count FROM dept d, temp (SELECT deptno, count(empno) count FROM emp GROUP BY deptno) temp WHERE d.deptno = temp.deptno(+);
Oracle-子查詢/復雜查詢實例