1. 程式人生 > 其它 >1.6 學習Oracle-子查詢

1.6 學習Oracle-子查詢

Oracle資料庫學習教程

子查詢

子查詢語法,就是select語句的巢狀

select * from emp where sal > (select sal from emp where ename='SCOTT')

1.注意事項

  1. 合理的書寫風格 (如上例,當寫一個較複雜的子查詢的時候,要合理的新增換行、縮排)
  2. 小括號( )
  3. 主查詢和子查詢可以是不同表,只要子查詢返回的結果主查詢可以使用即可
  4. 可以在主查詢的where、select、having、from後都可以放置子查詢
  5. 不可以在主查詢的group by後面放置子查詢 (SQL語句的語法規範)
  6. 強調:在from後面放置的子查詢(***)from後面放置是一個集合(表、查詢結果)
  7. 一般先執行子查詢(內查詢),再執行主查詢(外查詢);但是相關子查詢除外
  8. 一般不在子查詢中使用order by, 但在Top-N分析問題中,必須使用order by
  9. 單行子查詢只能使用單行操作符;多行子查詢只能使用多行操作符
  10. 子查詢中的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

喜歡請點關注❤️ ❤️ ❤️