當查詢問題過於複雜時,就需要套用一個未知的值當作比較對象到原本的查詢內
一般而言,如果查詢內有另外一個查詢,則寫在外層的稱為主查詢,內層的叫子查詢或是內層查詢
「一組連續的查詢中,把內層查詢結果當作外層查詢的檢索值」這種查詢又稱非相關查詢
子查詢語句大多都在主查詢語句的比較條件內,像是WHERE或HAVING,有時也可以放在FROM後面
SELECT 要檢索欄位
FROM 資料表
WHERE 表達式 運算符(SELECT 內層檢索項目
FROM 資料表
WHERE 比較運算符 欄位或條件值);
- 子查詢可以放在FROM WHERE HAVING子句中
- 運算符包括比較條件,像是> = OR IN等
- 比較條件分為
(1)單列運算符(> = >= <= < <>)用在只有一個返回值的單列子查詢返回值比較運算
(2)多列運算符(IN ANY ALL)用在一個以上返回值得多列子查詢返回值比較運算
子查詢總共可以分:
- 單列子查詢:此子查詢執行時只會返回一列資料
- 多列子查詢:此子查詢執行時可能返回多列資料
- 純量子查詢:此子查詢執行時返回的資料列僅含一個欄位
- 多欄子查詢:此子查詢執行時返回的資料含有一個以上的欄位
- 相關子查詢:此子查詢內的WHERE子句參照的比較欄位同時也是主查詢參照的欄位
子查詢規則
- 子查詢左右兩側需要有小括號
- 如果子查詢置於比較條件運算式內,習慣上,子查詢寫在比較符號的右側
- 比對單列子查詢返回值需用單列運算符,而比對多列子查詢返回值,需用多列運算符
多列子查詢特性
IN:等於資料列中的任一個成員
ANY:
(1)前面必須加上= < > <= >= <>其中一個
(2)把一個值和資料列中的每一個值比較,如果子查詢無返回職則評估結果為FALSE
(3)>ANY表示>最小值。<ANY表示<最大值
ALL:
(1)前面必須加上= < > <= >= <>其中一個
(2)把一個值和資料列中的每一個值比較,如果子查詢無返回職則評估結果為FALSE
(3)>ALL表示>最大值。<ALL表示<最小值
EXISTS運算子是判斷資料列是否有返回,有的話為TRUE否則為FALSE
NO EXISTS則是相反,有的話為FALSE否則為TRUE
SELECT 欄位1,...欄位N
FROM 資料表
WHERE EXISTS(子查詢);
WITH子句
當SQL有多個查詢時,可以用WITH子句命名子查詢區塊,簡化SQL子句,WITH要和SELECT一起使用
WITH
名稱1 AS(子查詢1區塊),
名稱2 AS(子查詢2區塊)
SELECT 名稱1.欄位
FROM 名稱1
WHERE 名稱1.欄位 比較運算符 名稱2.欄位