本節介紹 PostgreSQL 中可用的符合 SQL 標準的子查詢表示式。本節中記錄的所有表示式形式都返回布林值(真/假)。SQL-compliant subquery expressions available in PostgreSQL. All of the expression forms documented in this section return Boolean (true/false) results.
EXISTS
#EXISTS (subquery
)
EXISTS
的引數是任意 SELECT
語句,或者稱為子查詢。子查詢將被計算以確定它是否返回任何行。如果它至少返回一行,則 EXISTS
的結果為“true”;如果子查詢不返回任何行,則 EXISTS
的結果為“false”。
子查詢可以引用外部查詢中的變數,這些變數在子查詢的任何一次計算中都將充當常量。
子查詢通常只執行到足以確定是否至少返回一行,而不是完全執行完畢。編寫具有副作用(例如呼叫序列函式)的子查詢是不明智的;副作用是否發生可能無法預測。
由於結果僅取決於是否返回任何行,而與這些行的內容無關,因此子查詢的輸出列表通常不重要。常見的編碼約定是將所有 EXISTS
測試寫成 EXISTS(SELECT 1 WHERE ...)
的形式。但是,此規則也有例外,例如使用 INTERSECT
的子查詢。
這個簡單的示例類似於在 col2
上進行內連線,但即使 tab2
有多行匹配,它也會為每行 tab1
生成最多一行輸出。
SELECT col1 FROM tab1 WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
IN
#expression
IN (subquery
)
右側是一個帶括號的子查詢,它必須返回一個且僅一個列。左側表示式將被計算並與子查詢結果的每一行進行比較。如果找到任何相等的子查詢行,則 IN
的結果為“true”。如果沒有找到相等的行(包括子查詢不返回任何行的情況),則結果為“false”。
請注意,如果左側表示式產生 null,或者沒有相等的右側值且至少有一個右側行產生 null,則 IN
構造的結果將是 null,而不是 false。這符合 SQL 關於 null 值布林組合的常規規則。
與 EXISTS
一樣,假定子查詢會完全評估是不明智的。
row_constructor
IN (subquery
)
此形式的 IN
的左側是行建構函式,如 第 4.2.13 節中所述。右側是一個帶括號的子查詢,它必須返回的列數與左側行中的表示式數相同。左側表示式將被計算並逐行與子查詢結果的每一行進行比較。如果找到任何相等的子查詢行,則 IN
的結果為“true”。如果沒有找到相等的行(包括子查詢不返回任何行的情況),則結果為“false”。
一如既往,行中的 null 值按照 SQL 布林表示式的常規規則組合。兩行被認為相等,如果它們的所有對應成員都非 null 且相等;如果任何對應成員非 null 且不相等,則這些行不相等;否則,該行比較的結果未知(null)。如果所有逐行結果都是不相等或 null,且至少有一個 null,則 IN
的結果為 null。
NOT IN
#expression
NOT IN (subquery
)
右側是一個帶括號的子查詢,它必須返回一個且僅一個列。左側表示式將被計算並與子查詢結果的每一行進行比較。如果僅找到不相等的子查詢行(包括子查詢不返回任何行的情況),則 NOT IN
的結果為“true”。如果找到任何相等的行,則結果為“false”。
請注意,如果左側表示式產生 null,或者沒有相等的右側值且至少有一個右側行產生 null,則 NOT IN
構造的結果將是 null,而不是 true。這符合 SQL 關於 null 值布林組合的常規規則。
與 EXISTS
一樣,假定子查詢會完全評估是不明智的。
row_constructor
NOT IN (subquery
)
此形式的 NOT IN
的左側是行建構函式,如 第 4.2.13 節中所述。右側是一個帶括號的子查詢,它必須返回的列數與左側行中的表示式數相同。左側表示式將被計算並逐行與子查詢結果的每一行進行比較。如果僅找到不相等的子查詢行(包括子查詢不返回任何行的情況),則 NOT IN
的結果為“true”。如果找到任何相等的行,則結果為“false”。
一如既往,行中的 null 值按照 SQL 布林表示式的常規規則組合。兩行被認為相等,如果它們的所有對應成員都非 null 且相等;如果任何對應成員非 null 且不相等,則這些行不相等;否則,該行比較的結果未知(null)。如果所有逐行結果都是不相等或 null,且至少有一個 null,則 NOT IN
的結果為 null。
ANY
/SOME
#expression
operator
ANY (subquery
)expression
operator
SOME (subquery
)
右側是一個帶括號的子查詢,它必須返回一個且僅一個列。左側表示式將被計算並使用給定的運算子
與子查詢結果的每一行進行比較,該運算子
必須產生布爾結果。如果獲得任何真結果,則 ANY
的結果為“true”。如果沒有找到真結果(包括子查詢不返回任何行的情況),則結果為“false”。
SOME
是 ANY
的同義詞。IN
等同於 = ANY
。
請注意,如果沒有成功,並且至少有一行右側的值對該運算子的結果為 null,則 ANY
構造的結果將是 null,而不是 false。這符合 SQL 關於 null 值布林組合的常規規則。
與 EXISTS
一樣,假定子查詢會完全評估是不明智的。
row_constructor
operator
ANY (subquery
)row_constructor
operator
SOME (subquery
)
此形式的 ANY
的左側是行建構函式,如 第 4.2.13 節中所述。右側是一個帶括號的子查詢,它必須返回的列數與左側行中的表示式數相同。左側表示式將被計算並逐行與子查詢結果的每一行進行比較,使用給定的運算子
。如果比較對於任何子查詢行返回 true,則 ANY
的結果為“true”。如果比較對於每個子查詢行都返回 false(包括子查詢不返回任何行的情況),則結果為“false”。如果沒有任何與子查詢行的比較返回 true,並且至少有一個比較返回 NULL,則結果為 NULL。
有關行建構函式比較含義的詳細資訊,請參閱 第 9.25.5 節。
ALL
#expression
operator
ALL (subquery
)
右側是一個帶括號的子查詢,它必須返回一個且僅一個列。左側表示式將被計算並使用給定的運算子
與子查詢結果的每一行進行比較,該運算子
必須產生布爾結果。如果所有行都返回 true(包括子查詢不返回任何行的情況),則 ALL
的結果為“true”。如果找到任何 false 結果,則結果為“false”。如果沒有任何與子查詢行的比較返回 false,並且至少有一個比較返回 NULL,則結果為 NULL。
NOT IN
等同於 <> ALL
。
與 EXISTS
一樣,假定子查詢會完全評估是不明智的。
row_constructor
operator
ALL (subquery
)
此形式的 ALL
的左側是行建構函式,如 第 4.2.13 節中所述。右側是一個帶括號的子查詢,它必須返回的列數與左側行中的表示式數相同。左側表示式將被計算並逐行與子查詢結果的每一行進行比較,使用給定的運算子
。如果比較對於所有子查詢行都返回 true(包括子查詢不返回任何行的情況),則 ALL
的結果為“true”。如果比較對於任何子查詢行都返回 false,則結果為“false”。如果沒有任何與子查詢行的比較返回 false,並且至少有一個比較返回 NULL,則結果為 NULL。
有關行建構函式比較含義的詳細資訊,請參閱 第 9.25.5 節。
row_constructor
operator
(subquery
)
左側是行建構函式,如 第 4.2.13 節中所述。右側是一個帶括號的子查詢,它必須返回的列數與左側行中的表示式數相同。此外,子查詢不能返回多於一行。(如果它返回零行,則結果被視為 null。)左側表示式將被計算並逐行與唯一的子查詢結果行進行比較。
有關行建構函式比較含義的詳細資訊,請參閱 第 9.25.5 節。
如果您在文件中發現任何不正確之處、與您實際使用該功能時遇到的情況不符,或者需要進一步澄清之處,請使用 此表單 報告文件問題。