1. 程式人生 > >Oracle-子查詢/復雜查詢實例

Oracle-子查詢/復雜查詢實例

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) = (SELECT
job, 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-子查詢/復雜查詢實例