Oracle_Day2 子查詢

我叫阿狸貓發表於2014-01-08

1.可以在主查詢的where select from having後面放置子查詢

(1)select後面:發現第三列的內容是子查詢的結果

select ename,sal,(select job from emp where empno=7839) from emp;

(2)from後面:

select *
from
(select ename,sal from emp)

查詢部門名稱為SALES的員工資訊

方法一(子查詢):

SELECT * FROM
EMP
WHERE DEPTNO=(SELECT DEPTNO FROM DEPT WHERE DNAME='SALES')
方法二(多表查詢):

SELECT * FROM
EMP E,DEPT D
WHERE E.DEPTNO=D.DEPTNO AND D.DNAME='SALES'




多行子查詢:查詢結果返回多行

1.ANY:和子查詢任意一個比較

查詢工資比30號部門任意一個員工高的員工資訊

方法一:使用ANY關鍵字,表示取子查詢裡任意一個值

SELECT * FROM EMP
WHERE SAL > ANY (SELECT SAL FROM EMP WHERE DEPTNO=30)

方法二:因為是大於子查詢的任意一個值,那麼實際只要大於子查詢的最小值就行,只要比最小值大,就大於它任意一個值了。

SELECT * FROM EMP
WHERE SAL > (SELECT MIN(SAL) FROM EMP WHERE DEPTNO=30)

2.ALL:和子查詢所有的結果比較
查詢工資比30號部門所有員工高的員工資訊

SELECT * FROM
EMP  WHERE SAL > ALL(SELECT SAL FROM EMP WHERE DEPTNO=30)
方法二:因為是大於子查詢的所有值,那麼只要大於子查詢的最大值即可

SELECT * FROM
EMP  WHERE SAL > (SELECT MAX(SAL) FROM EMP WHERE DEPTNO=30)

3.NOT IN:不在子查詢結果中出現

查詢不是老闆的員工資訊,也就是說EMP表中的DEPTNO!=MGR

在學習NOT IN的時候講過NOT IN後面的值不能為null,而IN是可以為NULL的。

而從下圖看到有一行資訊的MGR為null,所以下面這條sql語句永遠都不可能有結果。

SELECT * FROM EMP
WHERE EMPNO NOT IN (SELECT MGR FROM EMP)


正確的sql是:在子查詢的時候就將null結果過濾掉

SELECT * FROM EMP
WHERE EMPNO NOT IN (SELECT MGR FROM EMP WHERE MGR IS NOT NULL)



相關文章