1. 程式人生 > >sql子查詢

sql子查詢

編寫 min style side lower any 編號 示例 操作

子查詢就是指的在一個完整的查詢語句之中,嵌套若幹個不同功能的小查詢,從而一起完成復雜查詢的一種編寫形式,為了讓讀者更加清楚子查詢的概念。子查詢返回結果子查詢可以返回的數據類型一共分為四種:
    1. 單行單列:返回的是一個具體列的內容,可以理解為一個單值數據;
    2. 單行多列:返回一行數據中多個列的內容;
    3. 多行單列:返回多行記錄之中同一列的內容,相當於給出了一個操作範圍;
    4. 多行多列:查詢返回的結果是一張臨時表;
在WHERE子句中使用子查詢在WHERE子句之中處理單行單列子查詢、多行單列子查詢、單行多列子查詢。單行單列子查詢 示例一、查詢公司之中工資最低的雇員的完整信息--查詢公司之中工資最低的雇員的完整信息 SELECT
* FROM emp e WHERE e.sal=( SELECT MIN(sal) FROM emp);示例二、查詢出基本工資比ALLEN低的全部雇員信息-- 查詢出基本工資比ALLEN低的全部雇員信息 SELECT * FROM emp e WHERE e.sal<( SELECT sal FROM emp WHERE ename=‘ALLEN‘ );示例三、查詢基本工資高於公司平均薪金的全部雇員信息 --查詢基本工資高於公司平均薪金的全部雇員信息 SELECT * FROM emp e WHERE e.sal>( SELECT AVG(sal) FROM
emp);單行多列子查詢。示例四、查找出與ALLEN從事同一工作,並且基本工資高於雇員編號為7521的全部雇員信息,--查找出與ALLEN從事同一工作,並且基本工資高於雇員編號為7521的全部雇員信息, SELECT * FROM emp e WHERE e.job=( SELECT job FROM emp WHERE ename=‘ALLEN‘) AND e.sal>( SELECT sal FROM emp WHERE empno=7521);示例五、查詢與SCOTT從事同一工作且工資相同的雇員信息SELECT * FROM emp e WHERE
(e.job,e.sal) = ( SELECT job,sal FROM emp WHERE ename=‘SCOTT‘) AND ename<>‘SCOTT‘;示例六、查詢與雇員7566從事同一工作且領導相同的全部雇員信息 --查詢與雇員7566從事同一工作且領導相同的全部雇員信息 SELECT * FROM emp e WHERE (e.job,e.mgr) =( SELECT job,mgr FROM emp WHERE empno=7566 );示例七、查詢與ALLEN從事同一工作且在同一年雇傭的全部雇員信息(包括ALLEN)--查詢與ALLEN從事同一工作且在同一年雇傭的全部雇員信息(包括ALLEN) SELECT * FROM emp e WHERE (e.job,to_char(e.hiredate,‘yyyy‘))=( SELECT job,to_char(hiredate,‘YYYY‘) FROM emp WHERE ename=‘ALLEN‘ );多行單列子查詢 主要使用三種操作符:IN、ANY、ALL IN操作示例八、查詢出與每個部門中最低工資相同的全部雇員信息--查詢出與每個部門中最低工資相同的全部雇員信息 SELECT * FROM emp e WHERE e.sal IN( SELECT MIN(sal) FROM emp GROUP BY deptno );示例九、查詢出不與每個部門中最低工資相同的全部雇員信息--查詢出不與每個部門中最低工資相同的全部雇員信息 SELECT * FROM emp e WHERE e.sal NOT IN( SELECT MIN(sal) FROM emp GROUP BY deptno );ANY在使用中有如下三種使用形式:=ANY:表示與子查詢中的每個元素進行比較,功能與IN類似(然而<>ANY不等價於NOT IN)>ANY:比子查詢中返回結果的最小的要大(還包含了>=ANY)<ANY:比子查詢中返回結果的最大的要小(還包含了<=ANY)示例十、查詢出每個部門經理的工資--查詢出每個部門經理的工資 SELECT * FROM emp WHERE sal = ANY ( SELECT MIN (sal) FROM emp WHERE job=‘MANAGER‘ GROUP BY deptno );示例十一、查詢出每個部門大於經理的工資--查詢出每個部門大於經理的工資 SELECT * FROM emp WHERE sal > ANY ( SELECT MIN (sal) FROM emp WHERE job=‘MANAGER‘ GROUP BY deptno );示例十二、查詢出每個部門小於經理的工資--查詢出每個部門小於經理的工資 SELECT * FROM emp WHERE sal < ANY ( SELECT MIN (sal) FROM emp WHERE job=‘MANAGER‘ GROUP BY deptno );ALL操作符有以下三種用法:<>ALL:等價於NOT IN(但是=ALL並不等價於IN)>ALL:比子查詢中最大的值還要大(還包含了>=ALL)<ALL:比子查詢中最小的值還要小(還包含了<=ALL)示例十三、查詢出每個部門不等於經理的工資--查詢出每個部門不等於經理的工資 SELECT * FROM emp WHERE sal <> ALL ( SELECT MIN (sal) FROM emp WHERE job=‘MANAGER‘ GROUP BY deptno );示例十四、SELECT * FROM emp WHERE sal < ALL ( SELECT MIN (sal) FROM emp WHERE job=‘MANAGER‘ GROUP BY deptno );示例十五、SELECT * FROM emp WHERE sal >ALL ( SELECT MIN (sal) FROM emp WHERE job=‘MANAGER‘ GROUP BY deptno );空數據判斷在SQL之中提供了一個exists結構用於判斷子查詢是否有數據返回。如果子查詢中有數據返回,則exists結構返回true,反之返回false。示例十五、驗證exists結構 --驗證exists結構 SELECT * FROM emp WHERE EXISTS( --返回空值,沒有內容輸出 SELECT * FROM emp WHERE empno=9999); --沒有這個編號的員工示例十六、 SELECT * FROM emp WHERE EXISTS(SELECT * FROM emp);--有內容將返回數據示例十七、 SELECT * FROM emp WHERE NOT EXISTS(SELECT * FROM emp);--有數據,但取返,沒有內容輸出

sql子查詢