1. 程式人生 > >mysql篇第十二課:查詢語句(五)

mysql篇第十二課:查詢語句(五)

  這節課我們來講子查詢:

 

  先來看我們的表和資料:

 

tbl_dept:

 

 

tbl_employee:

 

 

接下來看看子查詢的定義:

一條查詢語句中又嵌套了另一條完整的select語句,其中被巢狀的select語句,稱為子查詢或內查詢

在外面的查詢語句,稱為主查詢或外查詢

 

特點:

  1. 子查詢都放在小括號內

Demo 01:

-- 查詢開發部的所有員工

select * from tbl_employee where d_id in (

-- 子查詢放在括號裡

    select id from tbl_dept where dept_name = '開發部'

);

 

結果:

 

  1. 子查詢可以放在from後面、select後面、where後面、having後面,但一般放在條件的右側

說明一下,子查詢會生成一張虛表,虛表就是我們查出來的那個結果,這個結果並不是真實的表,只是一個數據而已,這份資料有和表類似的結構,所以叫虛表

虛表裡的資料全部存在記憶體裡,真實表的資料在磁碟上

 

3、子查詢優先於主查詢執行,主查詢使用了子查詢的執行結果(一張虛表)

4、子查詢根據查詢結果的行數不同分為以下兩類:

① 單行子查詢

         結果集只有一行

         一般搭配單行操作符使用:> < = <> >= <=

         非法使用子查詢的情況:

         a、子查詢的結果為一組值

         b、子查詢的結果為空

        

② 多行子查詢

         結果集有多行

         一般搭配多行操作符使用:any、all、in、not in

         in: 屬於子查詢結果中的任意一個就行

         any和all往往可以用其他查詢代替

 

基本上只會用到單行子查詢和in、not in

 

Demo 02:

-- 查詢不是開發部的所有員工

select * from tbl_employee where d_id not in (

-- 子查詢放在括號裡

    select id from tbl_dept where dept_name = '開發部'

);

 

接下來看看 any和all是什麼含義:

any關鍵詞可以理解為 對於子查詢返回的列中的任一數值,如果比較結果為true,則返回true

all 關鍵詞可以理解為 對於子查詢返回的列中的所有數值,如果比較結果為true,則返回true

 

Demo 03:

-- 查詢開發部和宣傳部的所有員工

select * from tbl_employee where d_id = any (

    select id from tbl_dept where dept_name = '開發部' or dept_name = '宣傳部'

);

 

結果:

 

any和all用的不多,因為這兩貨基本可以被其他語法代替,如:

 

  Demo 04:

-- 查詢開發部和宣傳部的所有員工

select * from tbl_employee where d_id in (

    select id from tbl_dept where dept_name = '開發部' or dept_name = '宣傳部'

);

 

= any 其實就是in

!= any 其實就是not in