本節描述本數據庫中可用的 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)
左手邊是一個行構造器。 右手邊是一個圓括弧括起來的子查詢,該查詢必須返回和左手邊行中表達式數目完全一樣的列。 另外,該子查詢不能返回超過一行的數量(如果它返回零行,那么結果就是空值)。 左手邊被計算并逐行與右手邊的子查詢結果行比較。