1. 程式人生 > >Oracle子查詢的注意問題

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