pgsql子查詢表示式

2021-06-22 08:42:05 字數 4783 閱讀 1469

postgresql 8.1 中文文件

prev

fast backward

chapter 9. 函式和操作符

fast forward

next

本節描述 postgresql 裡面能用的 sql 相容的子查詢表示式。所有本節中成文的表示式都返回布林值(真/假)結果。

exists (subquery

)

exists 的引數是乙個任意的select語句, 或者說子查詢。系統對子查詢進行運算以判斷它是否返回行。 如果它至少返回一行,那麼 exists 的結果就為"真"; 如果子查詢沒有返回行,那麼 exists 的結果是"假"。

子查詢可以引用來自周圍的查詢的變數,這些變數在該子查詢的任何一次計算中都起常量的作用。

這個子查詢通常只是執行到能判斷它是否可以生成至少一行為止, 而不是等到全部結束。在這裡寫任何有***的子查詢都是不明智的(比如呼叫序列函式);這些***是否發生是很難判斷的。

因為結果只取決於是否會返回行,而不取決於這些行的內容, 所以這個子查詢的輸出列表通常是無關緊要的。乙個常用的編碼習慣是用下面的形式寫所有的exists測試 exists(select 1 where ...)。不過這條規則有例外, 比如那些使用 intersect 的子查詢。

下面這個簡單的例子類似在col2上的一次內聯接,但是它為每個 tab1的行生成最多乙個輸出,即使存在多個匹配tab2的行也如此∶

select col1 from tab1

where exists(select 1 from tab2 where col2 = tab1.col2);

expression

in (subquery

)

in 的這種形式的右手邊是乙個圓括弧括起來的子查詢, 它必須只返回乙個字段。左手邊表示式對子查詢的結果的每一行進行一次計算和比較。 如果找到任何等於子查詢行的情況,那麼 in 的結果就是"真"。 如果沒有找到相等行,那麼結果是"假"(包括子查詢沒有返回任何行的特殊例子)。

請注意如果左手邊表示式生成 null,或者沒有相等的右手邊數值, 並且至少有乙個右手邊行生成 null,那麼 in 構造的結果將是 null,而不是假。 這個行為是遵照 sql 處理布林和 null 值組合時的規則定的。

和 exists 一樣,假設子查詢將被完成執行完全是不明智的。

row_constructor

in (subquery

)

這種形式的 in 的左手邊是乙個行構造器, 如 section 4.2.11 裡面所述, 右手邊是乙個圓括弧括起來的子查詢,它必須返回和左手邊返回的行中表示式所構成的完全一樣多的字段。 左手邊表示式就子查詢結果的每一行進行計算很比較。如果找到任意相等的子查詢行,則 in 的結果為"真"。如果沒有找到相等行, 那麼結果為"假"(包括子查詢不返回行的特殊例子)。

通常,表示式或者子查詢行裡的 null 是按照 sql 布林表示式的一般規則進行組合的。 如果兩個行對應的成員都是非空並且相等,那麼認為這兩行相等;如果任意對應成員為非空且不等,那麼該兩行不等; 否則這樣的行比較的結果是未知(null)。如果所有行的結果要麼是不等, 要麼是 null,並且至少有乙個 null,那麼 in 的結果是 null。

expression

not in (subquery

)

右手邊是乙個用圓括弧包圍的子查詢,它必須返回乙個字段。左手邊表示式就子查詢結果的每一行進行計算和比較。 如果只找到不相等的子查詢行(包括子查詢不返回行的特殊情況),那麼not in 的結果是"真"。 如果找到任何相等行,則結果為"假"。

請注意如果左手邊表示式返回空,或者如果沒有等於右手邊的值,並且至少乙個右手邊行生成空, 那麼 not in 構造的結果將是空,而不是真。這是根據 sql 對布林和空值組合的一般規則制定的。

和 exists 一樣,假設子查詢會完全結束是不明智的。

row_constructor

not in (subquery

)

not in 的這種形式左手邊是乙個行構造器, 如 section 4.2.11 裡所述。其右手邊是乙個圓括弧括起來的子查詢, 它必須返回和左手邊表示式返回的行一樣多的字段。 左手邊表示式對子查詢的結果的每一行進行一次計算和比較。 如果只出現不等於子查詢行的情況,那麼 not in 的結果就是"真"。 (包括子查詢沒有返回任何行的特殊例子)。如果找到相等行,那麼結果是"假"。

和通常一樣,表示式或者子查詢行裡的 null 是按照 sql 布林表示式的一般規則進行組合的。 如果兩個行對應的成員都是非空並且相等,那麼認為這兩行相等;如果任意對應成員為非空且不等,那麼該兩行不等; 否則這樣的行比較的結果是未知(null)。如果所有行的結果要麼是不等, 要麼是 null,並且至少有乙個 null,那麼 not in 的結果是 null。

expression

operator

any (subquery

)expression

operator

some (subquery

)

這種形式的 any 右手邊是乙個圓括弧括起來的子查詢, 它必須返回乙個字段。左手邊表示式將使用給出的 operator

對子查詢的結果的每一行進行一次計算和比較。 目前如果獲得任何真值結果,那麼 any 的結果就是"真"。 如果沒有找到真值結果,那麼結果是"假"(包括子查詢沒有返回任何行的特殊例子)。

some 是 any 的同意詞。 in 等效於 = any。

請注意如果沒有任何成功並且至少有乙個右手邊行為該操作符結果生成 null, 那麼 any 構造的結果將是 null,而不是 false。 這個行為是遵照 sql 處理布林和 null 值組合時的規則定的。

和 exists 一樣,假設子查詢將被完成執行完全是不明智的。

row_constructor

operator

any (subquery

)row_constructor

operator

some (subquery

)

的這種形式的左手邊是乙個行構造器,如 section 4.2.11 裡描述的那樣。 右手邊是乙個圓括弧括起來的子查詢, 它必須返回和左手邊列表給出的表示式一樣多的列。左手邊表示式將使用給出的 operator

對子查詢的結果的每一行進行一次計算和比較。 目前,系統只允許使用 = 或 <> 操作符處理逐行的 any 構造。 如果分別找到相等或者不相等的行,那麼 any 的結果就是 "真"。如果沒有找到這樣的行,那麼結果是"假"(包括子查詢沒有返回任何行的特殊例子)。

通常,表示式或者子查詢行裡的 null 是按照 sql 布林表示式的一般規則進行組合的。 如果兩個行對應的成員都是非空並且相等,那麼認為這兩行相等;如果任意對應成員為非空且不等,那麼該兩行不等; 否則這樣的行比較的結果是未知(null)。如果至少有乙個 null 行結果, 那麼 any 的結果將是true 或者 null。

expression

operator

all(subquery

)

all 的這種形式的右手邊是乙個圓括弧括起來的子查詢, 它必須只返回一列。左手邊表示式將使用給出的 operator

對子查詢的結果的每一行進行一次計算和比較。該操作符必須生成布林結果。 如果所有行的結果都為"真",(包括子查詢沒有返回任何行的特殊例子)。 那麼 all 的結果就是"真"。如果沒有存在任何假值結果,那麼結果是"假"。

not in 等效於 <> all。

請注意如果沒有運算失敗但是至少有乙個右手邊行為該操作符的結果生成 null 值, 那麼 all 構造的結果將是 null,而不是 true。 這個行為是遵照 sql 處理布林和 null 值組合時的一般規則定的。

和 exists 一樣,假設子查詢將被完成執行完全是不明智的。

row_constructor

operator

all (subquery

)

all 的這種形式的左手邊是乙個行構造器,如 section 4.2.11 所述。 右手邊是乙個圓括弧括起來的子查詢,它必須返回和左手邊行給出的表示式一樣多的字段。 左手邊表示式將使用給出的 operator

對子查詢的結果的每一行進行一次計算和比較。 目前系統只允許使用 = 和 <> 操作符處理逐行的 all 查詢。 如果所有子查詢都是相等或者不相等的行,那麼 all 的結果就是"真"。(包括子查詢沒有返回任何行的特殊例子)。 如果分別有任何不相等或者相等的行,那麼結果是"假"。

通常,表示式或者子查詢行裡的 null 是按照 sql 布林表示式的一般規則 進行組合的。如果兩個行對應的成員都是非空並且相等,那麼認為這兩行 相等;如果任意對應成員為非空且不等,那麼該兩行不等; 否則這樣的行比較的結果是未知(null)。如果至少有乙個 null 行結果, 那麼 all 的結果就不可能是true;它將會是 false 或者 null。

row_constructor

operator

(subquery

)

左手邊是乙個行構造器,如 section 4.2.11 所述。 右手邊是乙個圓括弧括起來的子查詢,該查詢必須返回很左手邊表示式數目完全一樣的字段。 另外,該子查詢不能返回超過一行的數量。(如果它返回零行,那麼結果就是 null。) 左手邊逐行與右手邊的子查詢結果行,或者右手邊表示式列表進行比較。目前,只允許使用 = 和 <> 操作符進行逐行比較。如果兩行分別是相等或者不等,那麼結果為"真"。

通常,表示式或者子查詢行裡的 null 是按照 sql 布林表示式的一般規則進行組合的。 如果兩個行對應的成員都是非空並且相等,那麼認為這兩行相等;如果任意對應成員為非空且不等,那麼該兩行不等; 否則這樣的行比較的結果是未知(null)。

prev

home

next

聚集函式

up行和陣列比較

pgsql條件表示式

postgresql 8.1 中文文件 prev fast backward chapter 9.函式和操作符 fast forward next 本節描述在 postgresql 裡可以用的sql相容的條件表示式。sqlcase 表示式是一種通用的條件表示式,類似於其它語言中的 if else 語...

查詢表示式

這個特性使得你可以在c 中使用sql類似風格的語句,也被稱作linq 語言整合查詢 舉例來說,你可以這樣描述你的資料 ublic class coordinate 在c 裡,你可以像下面一樣輕鬆的宣告乙個資料庫表的邏輯等同式 use object and collection initializer...

查詢表示式

版本 新增功能 5.0.9 比較運算增加閉包子查詢支援 5.0.4 支援對同乙個字段多次呼叫查詢方法 查詢表示式支援大部分的sql查詢語法,也是 thinkphp 查詢語言的精髓,查詢表示式的使用格式 where 欄位名 表示式 查詢條件 where or 欄位名 表示式 查詢條件 表示式不分大小寫...