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