Mysql子查詢 概念分析: 根據相關性分: (1)不相關子查詢:一條Sql語句中含有多條SELECT語句,先執行子查詢,再執行外查詢,子查詢可對立運行 關鍵字:(1)先子查詢,再外查詢 (2)可以對立運行,即可以單獨運行子查詢,對外查詢不幹擾 (2)相關子查詢:子查詢不能獨立運行,並且先運行外查詢 ...
Mysql子查詢
概念分析:
根據相關性分:
(1)不相關子查詢:一條Sql語句中含有多條SELECT語句,先執行子查詢,再執行外查詢,子查詢可對立運行
關鍵字:(1)先子查詢,再外查詢
(2)可以對立運行,即可以單獨運行子查詢,對外查詢不幹擾
(2)相關子查詢:子查詢不能獨立運行,並且先運行外查詢,再運行子查詢
關鍵字:(1)先外查詢,再子查詢
(2)子查詢不能獨立運行
例如:
(1)不相關子查詢
--查詢【和CLARK同一部門且比他工資低的】雇員名字和工資。
-- 第一步:先查詢CLARK部門和和CLARK工資
select deptno from emp where ename='CLARK'
select sal from emp where ename ='CLARK'
-- 第三步:分別查詢,部門和CLARK一樣的,工資比他少的
select ename ,sal,deptno from emp where deptno = (select deptno from emp where ename='CLARK') and sal < (select sal from emp where ename ='CLARK')
這上面查詢過程中:子查詢可以獨立運行,並且是先於外查詢的,
(2)相關子查詢
--查詢[工資高於其所在部門20的平均工資的]那些員工
select * from emp e1 where e1.deptno = 20 and sal >(select avg(sal) from emp e2 where e2.deptno = 10)
在這條語句中,子查詢內部的WHERE關鍵字後的條件中外查詢的條件參與,不能單獨運行
二:根據查詢結果
(1)單行子查詢:子查詢結果只有一條數據
(2)多行子查詢:子查詢結果有多條記錄,此時之間不能用= < >,要藉助 ANY ALL IN 來實現
例如:
(1)單行子查詢:
--查得所有【比“CLARK”工資高的】員工的信息 select * from emp select sal from emp where ename ='CLARK' --2450 select * from emp where sal > 2450.00 子查詢結果只有一條 select * from emp where sal > (select sal from emp where ename ='CLARK')
(2)多行子查詢
--查詢工資低於任何一個“CLERK”的工資的雇員信息。 select * from emp where sal< (select max(sal) from emp where job ='CLERK') select sal from emp where job ='CLERK' --1300 1100 950 800 select * from emp where sal< any(select sal from emp where job ='CLERK') --查詢[工資比所有的“SALESMAN”都高的]雇員的編號、名字和工資。 --ALL >ALL select empno,ename,sal from emp where sal >(select max(sal) from emp where job ='SALESMAN') select empno,ename,sal from emp where sal > ALL(select sal from emp where job ='SALESMAN') select max(sal) from emp where job ='SALESMAN' --查詢部門20中職務同部門10的雇員一樣的雇員信息。 select job from emp where deptno = 20 --CLERK ANALYST select job from emp where deptno = 10 --MANAGER PRESIDENT CLERK ---- CLERK MANAGER -- IN 等於其中任何一個 select * from emp where deptno = 20 and job in (select job from emp where deptno = 10)