Oracle子查詢的注意問題
1. 子查詢中小括號,子查詢要用()包起來
select * from emp where sal>(select * from emp where ename=’likang’)
2. Oracle子查詢書寫風格
縮緊、對齊、換行等等,便於觀察
3. Oracle可以使用的位置:
可以在where、select、having、from之後使用子查詢
如果查詢的時候有其他欄位,就必須為單行子查詢。
select ename,sal,dept (select comm from emp where ename=’likang’)from emp;--其中select comm from emp where ename=’likang’必須返回一條資料
where 與having的區別一般使用where進行,但是如果出現主函式就必須使用having進行判斷
4. oracle中不可以在group by後使用子查詢
5. from後的子查詢:
子查詢返回的也是一個新表
6. 主查詢與子查詢的可以不是同一個表,只要子查詢查詢的結果在主查詢可以使用即可。
如果不考慮多表查詢產生的笛卡爾積,那麼多表查詢要好於子查詢,但是具體問題要具體對待。
7. 一般不在子查詢中使用排序,但是在Top-N分析問題中必須使用子查詢排序
–rownum 行號偽列,如果要使用偽列,就必須在資料查詢語句中顯示呼叫。select rownum,ename,sal from emp;--rownum
行號永遠按照預設的順序生成,不會根據欄位排序的改變而改變.只能使用<、<=
select roenum,ename,salfrom(select * from emp order by sal desc) where rownum <=3;--在使用的時候先排序,在把排序後的結果返回,當作一個新表,最後在新表上操作rownum.
8. 一般先執行子查詢在進行主查詢,但是相關子查詢例外(把主查詢的值作為引數傳遞到子查詢中)
查詢工資大於本部門平均工資的員工
1. 找出本部門平均工資2.比較
select empno,ename,sal , select avg(sal) from emp where deptno=e.deptno) avgsal from emp ewhere sal>(select avg(sal) from emp where deptno=e.deptno) ;—注意這裡是給主查詢的表建立別名,利用別名在子查詢中使用。
9. 單行子查詢只能使用單行操作符,多行子查詢只能使用多行操作符
單行操作符:=、>、< 、>= 、<=、<>
多行操作符: in,any,all
10. 子查詢的null問題
單行子查詢不返回任何行,所以不會得到結果。
只要子查詢查詢的有空值,不能使用not in .a not in (10,20,null) 等價於a !=10 and a!=20and a!=null//判斷為空不是!=null 所以會A!=null永遠為假。
In =any //not in=all