Postgres 子查詢 介紹

2021-07-26 20:50:31 字數 3193 閱讀 9791

postgres子查詢主要包含如下幾個關鍵字: exists, in, not in, any/some, all,詳細介紹如下:

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

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

這個子查詢通常只是執行到能判斷它是否可以返回至少一行為止, 而不是等到全部結束。

因為結果只取決於是否會返回行,而不取決於這些行的內容, 所以這個子查詢的輸出列表通常是無關緊要的。

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

select col1

from tab1

where

exists (select

1from tab2 where col2 = tab1.col2);

expression in (subquery)
關鍵字』in』的右側是乙個圓括弧括起來的子查詢, 它必須返回乙個列。expressio將被計算並與subquery結果逐行進行比較。 如果找到任何等於子查詢行的值,那麼in的結果就是」真」。 如果沒有找到,那麼結果是」假」(包括子查詢沒有返回任何行的情況)。

如果expression表示式得到空值,或者沒有相等子查詢值, 且至少有乙個子查詢得到空值,那麼in結構的結果將是空值,而不是假。這點時遵循sql標準。

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

row_constructor in (subquery)
這種形式的in的左側是乙個行構造器, 右側是乙個圓括弧子查詢,它必須返回和左側的行中表示式所構成的完全一樣多的列。 表示式將被計算並與子查詢結果逐行進行比較。如果找到任意相等的子查詢行,則in的結果為」true」。如果沒有找到相等行, 那麼結果為」假」(包括子查詢不返回行的情況)。

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

expression not in (subquery)
關鍵字』not in』是乙個用圓括號括起的子查詢,它必須返回一列。左側表示式將被計算並與子查詢結果逐行進行比較。 如果只找到不相等的子查詢行(包括子查詢不返回行的情況),那麼not in的結果是」真」。 如果找到任何相等行,則結果為」假」。

如果左側表示式得到空值,或者沒有相等的右手邊值, 並且至少有乙個右手邊行得到空值,那麼not in結構的結果將是空值,而不是真。這個行為是遵照 sql 標準。

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

row_constructor not in (subquery)
這種形式的not in的左側是乙個行構造器,右側是乙個圓括弧子查詢,它必須返回和左手邊返回的行中表示式所構成的完全一樣多的列。 左手邊表示式將被計算並與子查詢結果逐行進行比較。如果找到不等於子查詢行的行,則not in的結果為」true」。如果找到相等行, 那麼結果為」假」(包括子查詢不返回行的情況)。

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

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。

expression operator all (subquery)
all 的這種形式的右側是乙個圓括弧括起來的子查詢, 它必須返回一列。左側表示式將被計算並使用給出的操作符對子查詢結果逐行進行比較。該操作符必須生成布林結果。 如果所有行得到真(包括子查詢沒有返回任何行的情況),all的結果就是」真」。如果沒有存在任何假值結果,那麼結果是」假」。如果比較為任何行都不返回假並且對至少一行返回 null,則結果為 null。

not in等價於<> all。

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

row_constructor operator all (subquery)
all的這種形式的左側是乙個行構造器,右側是乙個圓括弧括起來的子查詢,它必須返回和左側中表示式一樣多的列。 左手邊表示式將被計算並使用給出的 操作符對子查詢結果逐行進行比較。如果對所有子查詢行該比較都返回真,那麼all的結果就是」真」(包括子查詢沒有返回任何行的情況)。如果對任何子查詢行比較返回假,則結果為」假」。如果比較對任何子查詢行都不返回假並且對至少一行返回 null,則結果為 null。

postgres遞迴查詢

1 開發中我們經常會遇到資料庫中的資料存在存在上小級的父子關係,如全國的省市資訊,或者乙個公司的部門資訊等。如果我們在查詢的時候使用遞迴的方法直接將資料查詢出來就可以避免我們在程式中在進行遞迴過濾資料了,下面我們以全國的省市為例,首先我們定義一張表,表的定義如下 然後我們在其中放一些資料,資料如下 ...

Postgres的介紹和安裝

介紹 目前mysql被炒得沸沸揚揚,熱火朝天,但我卻對大家為什麼不用postgresql感到很不理解,甚至很多人都不知道postgresql是什麼,postgresql 是一種非常複雜的物件 關係型資料庫管理系統 ordbms 也是目前功能最強大,特性最豐富和最複雜的自由軟體資料庫系統。有些特性甚至...

Postgres的介紹和安裝

介紹 目前mysql被炒得沸沸揚揚,熱火朝天,但我卻對大家為什麼不用postgresql感到很不理解,甚至很多人都不知道postgresql是什麼,postgresql 是一種非常複雜的物件 關係型資料庫管理系統 ordbms 也是目前功能最強大,特性最豐富和最複雜的自由軟體資料庫系統。有些特性甚至...