?
本文檔使用 PHP中文網(wǎng)手冊 發(fā)布
本節(jié)描述PostgreSQL里與SQL兼容的子查詢表達式。 所有本節(jié)中的表達式都返回布爾值(真/假)結果
EXISTS (subquery)
EXISTS的參數(shù)是一個任意的SELECT語句,或者說子查詢。 系統(tǒng)對子查詢進行運算以判斷它是否返回行。如果它至少返回一行, 那么EXISTS的結果就為"真"true""; 如果子查詢沒有返回任何行,那么EXISTS的結果是"假"false""。
子查詢可以引用包圍它的查詢的變量,這些變量在該子查詢的每一次計算中都起常量的作用。
這個子查詢通常只是運行到能判斷它是否可以生成至少一行為止, 而不是等到全部結束。在這里寫任何有副作用的 子查詢都是不明智的(比如調(diào)用序列函數(shù));這些副作用是否發(fā)生是很難判斷的。
因為結果只取決于是否會返回行,而不取決于這些行的內(nèi)容, 所以這個子查詢的輸出列表通常是無關緊要的。一個常用的編碼習慣是 用下面的形式寫EXISTS測試:EXISTS(SELECT 1 WHERE ...)。 不過這條規(guī)則也有例外,比如那些使用INTERSECT的子查詢。
下面這個簡單的例子類似在col2上的一次內(nèi)連接,但是它為每 個tab1的行生成最多一個輸出,即使存在多個匹配tab2的行也如此
SELECT col1 FROM tab1 WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
expressionIN (subquery)
右邊是一個圓括號括起來的子查詢,它必須只返回一個字段。 左邊表達式對子查詢結果的每一行進行一次計算和比較。 如果找到任何相等的子查詢行,則IN結果為"真"true""。如果沒有找到任何相等行, 則結果為"假"false""(包括子查詢沒有返回任何行的情況)。
請注意,如果左邊表達式的值為 NULL ,或者沒有相等的右邊值并且至少有一個右邊行生成 NULL ,那么IN的結果將是 NULL , 而不是假。這個行為遵照 SQL 處理布爾值和 NULL 組合時的規(guī)則。
和EXISTS一樣,假設完全運行子查詢是不明智的。
row_constructorIN (subquery)
左邊是一個行構造器(如Section 4.2.12所述),右邊是一個圓括號括起來的子查詢, 它必須返回和左邊行構造器一樣多的字段。左邊表達式對子查詢結果的每一行 進行一次計算和比較。如果找到相等的子查詢行,則IN結果為"真"true""。 如果沒有找到任何相等行,則結果為"假"false""(包括子查詢沒有返回任何行的情況)。
表達式或子查詢行里的 NULL 遵照 SQL 處理布爾值和 NULL 組合時的規(guī)則。如果兩個行對應的字段都相等且非空, 那么這兩行相等;如果任意對應字段不等且非空,那么這兩行不等;否則結果是未知(NULL)。如果每一行的結果都是不等或 NULL , 并且至少有一個 NULL ,那么 IN 的結果是 NULL
expressionNOT IN (subquery)
右邊是一個圓括號括起來的子查詢,它必須只返回一個字段。左邊表達式對子查詢結果的每一行進行一次計算和比較。 如果只找到不相等的子查詢行(包括子查詢沒有返回任何行的情況), 則NOT IN結果為"真"true""。如果找到任何相等行,則結果為"假"false""。
請注意,如果左邊表達式的值為 NULL ,或者沒有相等的右邊值并且至少有一個右邊行生成 NULL ,那么NOT IN的結果將是 NULL , 而不是真。這個行為遵照 SQL 處理布爾值和 NULL 組合時的規(guī)則
和EXISTS一樣,假設完全運行子查詢是不明智的。
row_constructorNOT IN (subquery)
左邊是一個行構造器(如Section 4.2.12所述),右邊是一個圓括號括起來的子查詢, 它必須返回和左邊行構造器一樣多的字段。左邊表達式對子查詢結果的每一行 進行一次計算和比較。如果只出現(xiàn)不相等的子查詢行,則NOT IN結果為"真"true""。 (包括子查詢沒有返回任何行的情況)。如果找到相等的子查詢行,則結果為"假"false""。
表達式或子查詢行里的 NULL 遵照 SQL 處理布爾值和 NULL 組合時的規(guī)則。 如果兩個行對應的字段都相等且非空,那么這兩行相等;如果任意對應字段不等且非空,那么這兩行不等; 否則結果是未知(NULL)。如果每一行的結果都是不等或 NULL , 并且至少有一個 NULL ,那么NOT IN的結果是 NULL 。
expressionoperatorANY (subquery) expressionoperatorSOME (subquery)
右邊是一個圓括號括起來的子查詢,它必須只返回一個字段。 左邊表達式使用operator對子查詢結果的每一行進行一次計算和比較, 其結果必須是布爾值。如果至少獲得一個真值,則ANY結果為"真"true""。 如果全部獲得假值,則結果是"假"false""(包括子查詢沒有返回任何行的情況)。
SOME是ANY的同意詞。IN等效于= ANY。
請注意,如果沒有獲得任何真值并且至少有一個右邊行在該操作符上生成 NULL , 那么ANY的結果將是 NULL , 而不是假。這個行為遵照 SQL 處理布爾值和 NULL 組合時的規(guī)則。
和EXISTS一樣,假設完全運行子查詢是不明智的。
row_constructoroperatorANY (subquery) row_constructoroperatorSOME (subquery)
左邊是一個行構造器(如Section 4.2.12所述),右邊是一個圓括號括起來的子查詢, 它必須返回和左邊行構造器一樣多的字段。左邊表達式使用operator對子查 詢結果的每一行進行一次計算和比較,其結果必須是布爾值。如果至少獲得一個真值, 則ANY結果為"真"true""。如果全部獲得假值, 則結果是"假"false""(包括子查詢沒有返回任何行的情況)。 如果沒有獲得任何真值并且至少有一個右邊行在該操作符上生成 NULL 。
查看Section 9.21.5獲取關于逐行比較的細節(jié)。
expressionoperatorALL (subquery)
右邊是一個圓括號括起來的子查詢,它必須只返回一個字段。 左邊表達式使用operator對子查詢結果的每行進行一次計算和比較, 其結果必須是布爾值。如果全部獲得真值,ALL結果為"真"true""(包括子查詢沒有返回任何行的情況)。 如果至少獲得一個假值,則結果是"假"。如果比較不會返回任何行為 false,并且至少一個行返回 NULL,則結果為 NULL。
NOT IN等效于<> ALL。
和EXISTS一樣,假設完全運行子查詢是不明智的。
row_constructoroperatorALL (subquery)
左邊是一個行構造器(如Section 4.2.12所述),右邊是一個圓括號括起來的子查詢, 它必須返回和左邊行構造器一樣多的字段。左邊表達式使用operator對子查詢結果 的每一行進行一次計算和比較,其結果必須是布爾值。如果全部獲得真值, ALL結果為"真"true""(包括子查詢沒有返回任何行的情況)。 如果至少獲得一個假值,則結果是"假"false""。如果比較不會返回任何行為 false,并且至少一個行返回 NULL,則結果為 NULL。
查看Section 9.21.5以獲取關于逐行比較的細節(jié)
row_constructoroperator(subquery)
左邊是一個行構造器(如Section 4.2.12所述),右邊是一個圓括號括起來的子查詢, 它必須返回和左邊行構造器一樣多的字段。而且,該子查詢不能返回超 過 1 行結果(返回零行相當于 NULL)。 左邊表達式對子查詢的唯一結果行進行計算和比較。
查看Section 9.21.5以獲取關于逐行比較的細節(jié)。