mysql篇第十二課:查詢語句(五)
這節課我們來講子查詢:
先來看我們的表和資料:
tbl_dept:
tbl_employee:
接下來看看子查詢的定義:
一條查詢語句中又嵌套了另一條完整的select語句,其中被巢狀的select語句,稱為子查詢或內查詢
在外面的查詢語句,稱為主查詢或外查詢
特點:
- 子查詢都放在小括號內
Demo 01:
-- 查詢開發部的所有員工
select * from tbl_employee where d_id in (
-- 子查詢放在括號裡
select id from tbl_dept where dept_name = '開發部'
);
結果:
- 子查詢可以放在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