1.6 學習Oracle-子查詢
Oracle資料庫學習教程
子查詢
子查詢語法,就是select語句的巢狀
select * from emp where sal > (select sal from emp where ename='SCOTT')
1.注意事項
- 合理的書寫風格 (如上例,當寫一個較複雜的子查詢的時候,要合理的新增換行、縮排)
- 小括號( )
- 主查詢和子查詢可以是不同表,只要子查詢返回的結果主查詢可以使用即可
- 可以在主查詢的where、select、having、from後都可以放置子查詢
- 不可以在主查詢的group by後面放置子查詢 (SQL語句的語法規範)
- 強調:在from後面放置的子查詢(***)from後面放置是一個集合(表、查詢結果)
- 一般先執行子查詢(內查詢),再執行主查詢(外查詢);但是相關子查詢除外
- 一般不在子查詢中使用order by, 但在Top-N分析問題中,必須使用order by
- 單行子查詢只能使用單行操作符;多行子查詢只能使用多行操作符
- 子查詢中的null值
2.主查詢,子查詢可以是不同的表
根據部門名,查該部門所有員工.在部門表由部門名找到部門號,在根據部門號去員工表找所有該部門的的員工.
select * from emp where deptno = (select deptno from dept where dname = 'SALES')
SQL優化:使用多表查詢其實效能更優.
3. 在主查詢的where,select,having,from處放置子查詢
select empno,ename,(select dname from dept where depno = 10)部門 from emp;
其他的類似,但where後面不能使用組函式
select * from (select ename,sal from emp);
4.單行子查詢和多行子查詢
單行子查詢:子查詢返回一行的資料
單行操作符有:=,>,>=,<,<=,<>/!=
多行子查詢:子查詢返回多行的資料
多行操作符有:IN/NOT IN,ANY,ALL
IN:在集合中
select * from where deptno in (select deptno from dept where dname = 'SALES' or dname = 'ACCOUNTING')
ANY:和集合的任意值比較
查薪水比30號部門任何一人高的員工:
錯誤比較:select * from emp where sal > (select sal from emp where deptno=30);
因為>是單行查詢
正確方式,在>號後面加上ANY
ALL:和集合中所有值比較
和ANY類似,在比較符號後面加上ALL
5. 子查詢值為NULL
注意使用is或者is not,不能使用not in,但可以使用in.
查詢不是老闆的員工:
select * from emp where empno not in(select mgr from emp);
沒有結果,因為有NULL.如果使用in則可以.
select * from emp where empno not in (select mgr from emp where mgr is not null);
6.其他
一般不在子查詢中使用order by
一般先執行子查詢,再執行主查詢
本文來自部落格園,作者:Ovins,轉載請註明原文連結:https://www.cnblogs.com/ovins/p/15375761.html
喜歡請點關注❤️ ❤️ ❤️