本節描述本資料庫中可用的 SQL 相容的子查詢運算式。所有本節中成文的運算式都返回布爾值(真/假)結果。
EXISTS
EXISTS (subquery)EXISTS的參數是一個任意的SELECT語句, 或者說子查詢。系統對子查詢進行運算以判斷它是否返回行。如果它至少返回一行,那麼EXISTS的結果就為“真”; 如果子查詢沒有返回行,那麼EXISTS的結果是“假”。
子查詢可以引用來自周圍的查詢的變數,這些變數在該子查詢的任何一次計算中都起常量的作用。
這個子查詢通常只是運行到能判斷它是否可以返回至少一行為止, 而不是等到全部結束。在這裡寫任何有副作用的子查詢都是不明智的(例如調用序列函數);這些副作用是否發生是很難判斷的。
因為結果只取決於是否會返回行,而不取決於這些行的內容, 所以這個子查詢的輸出資料行表通常是無關緊要的。一個常用的編碼習慣是用EXISTS(SELECT 1 WHERE ...)的形式寫所有的EXISTS測試。不過這條規則有例外,例如那些使用INTERSECT的子查詢。
下面這個簡單的例子類似在col2上的一次內聯結,但是它為每個 tab1的行產生最多一個輸出,即使存在多個匹配tab2的行也如此 ∶
SELECT col1
FROM tab1
WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);IN
expression IN (subquery)右手邊是一個圓括弧括起來的子查詢, 它必須正好只返回一個列。左手邊運算式將被計算並與子查詢結果逐行進行比較。 如果找到任何等於子查詢行的情況,那麼IN的結果就是“真”。 如果沒有找到相等行,那麼結果是“假”(包括子查詢沒有返回任何行的情況)。
請注意如果左手邊運算式得到空值,或者沒有相等的右手邊值, 並且至少有一個右手邊行得到空值,那麼IN結構的結果將是空值,而不是假。這個行為是遵照 SQL 處理空值的一般規則的。
和EXISTS一樣,假設子查詢將被完成運行完全是不明智的。
row_constructor IN (subquery)這種形式的IN的左手邊是一個行構造器, 如行構造器中所述。 右手邊是一個圓括弧子查詢,它必須返回和左手邊返回的行中運算式所構成的完全一樣多的列。 左手邊運算式將被計算並與子查詢結果逐行進行比較。如果找到任意相等的子查詢行,則IN的結果為“真”。如果沒有找到相等行, 那麼結果為“假”(包括子查詢不返回行的情況)。
通常,運算式或者子查詢行裡的空值是按照 SQL 布林運算式的一般規則進行組合的。 如果兩個行對應的成員都非空並且相等,那麼認為這兩行相等;如果任意對應成員為非空且不等,那麼這兩行不等; 否則這樣的行比較的結果是未知(空值)。如果所有行的結果要麼是不等, 要麼是空值,並且至少有一個空值,那麼IN的結果是空值。
NOT IN
expression NOT IN (subquery)右手邊是一個用圓括弧包圍的子查詢,它必須返回正好一個列。左手邊運算式將被計算並與子查詢結果逐行進行比較。 如果只找到不相等的子查詢行(包括子查詢不返回行的情況),那麼NOT IN的結果是“真”。 如果找到任何相等行,則結果為“假”。
請注意如果左手邊運算式得到空值,或者沒有相等的右手邊值, 並且至少有一個右手邊行得到空值,那麼NOT IN結構的結果將是空值,而不是真。這個行為是遵照 SQL 處理空值的一般規則的。
和EXISTS一樣,假設子查詢會完全結束是不明智的。
row_constructor NOT IN (subquery)這種形式的NOT IN的左手邊是一個行構造器。 右邊是一個圓括弧子查詢,它必須返回和左手邊返回的行中運算式所構成的完全一樣多的列。 左手邊運算式將被計算並與子查詢結果逐行進行比較。如果找到不等於子查詢行的行,則NOT IN的結果為“真”。如果找到相等行, 那麼結果為“假”(包括子查詢不返回行的情況)。
通常,運算式或者子查詢行裡的空值是按照 SQL 布林運算式的一般規則進行組合的。 如果兩個行對應的成員都非空並且相等,那麼認為這兩行相等;如果任意對應成員為非空且不等,那麼這兩行不等; 否則這樣的行比較的結果是未知(空值)。如果所有行的結果要麼是不等, 要麼是空值,並且至少有一個空值,那麼NOT IN的結果是空值。
ANY/SOME
expression operator ANY (subquery)
expression operator SOME (subquery)這種形式的右手邊是一個圓括弧括起來的子查詢, 它必須返回正好一個列。左手邊運算式將被計算並使用給出的 操作符對子查詢結果逐行進行比較。如果獲得任何真值結果,那麼ANY的結果就是“真”。 如果沒有找到真值結果,那麼結果是“假”(包括子查詢沒有返回任何行的情況)。
SOME是ANY的同義字。IN等價於= ANY。
請注意如果沒有任何成功並且至少有一個右手邊行為該操作符結果產生空值, 那麼ANY結構的結果將是空值,而不是假。 這個行為是遵照 SQL 處理空值布爾組合的一般規則制定的。
和EXISTS一樣,假設子查詢將被完全運行是不明智的。
row_constructor operator ANY (subquery)
row_constructor operator SOME (subquery)這種形式的左手邊是一個行構造器,如行構造器所述。右手邊是一個圓括弧括起來的子查詢, 它必須返回和左手邊列表給出的運算式一樣多的列。左手邊運算式將被計算並使用給出的操作符對子查詢結果逐行進行比較。如果比較為任何子查詢行返回真,則ANY的結果為“真”。如果比較對每一個子查詢行都返回假,則結果為“假”(包括子查詢不返回行的情況)。如果比較不對任何行返回真並且至少對一行返回 NULL,則結果為 NULL。
ALL
expression operator ALL (subquery)ALL 的這種形式的右手邊是一個圓括弧括起來的子查詢, 它必須只返回一列。左手邊運算式將被計算並使用給出的 操作符對子查詢結果逐行進行比較。該操作符必鬚生成布爾結果。 如果所有行得到真(包括子查詢沒有返回任何行的情況),ALL的結果就是“真”。如果沒有存在任何假值結果,那麼結果是“假”。如果比較為任何行都不返回假並且對至少一行返回 NULL,則結果為 NULL。
NOT IN等價於<> ALL。
和EXISTS一樣,假設子查詢將被完全運行是不明智的。
row_constructor operator ALL (subquery)ALL的這種形式的左手邊是一個行構造器,如行構造器所述。 右手邊是一個圓括弧括起來的子查詢,它必須返回和左手邊行中運算式一樣多的列。 左手邊運算式將被計算並使用給出的 操作符對子查詢結果逐行進行比較。如果對所有子查詢行該比較都返回真,那麼ALL的結果就是“真”(包括子查詢沒有返回任何行的情況)。如果對任何子查詢行比較返回假,則結果為“假”。如果比較對任何子查詢行都不返回假並且對至少一行返回 NULL,則結果為 NULL。
單一行比較
row_constructor operator (subquery)左手邊是一個行構造器。 右手邊是一個圓括弧括起來的子查詢,該查詢必須返回和左手邊行中運算式數目完全一樣的列。 另外,該子查詢不能返回超過一行的數量(如果它返回零行,那麼結果就是空值)。 左手邊被計算並逐行與右手邊的子查詢結果行比較。