這個部分介紹了在PolarDB中遵循SQL標準的子查詢運算式。所有在這部分提到的運算式傳回值都是布爾類型(真/假)結果。
EXISTS
EXISTS的參數是一條以任意形式出現的SELECT語句或者子查詢。首先運行子查詢語句來決定這個子查詢語句是否返回記錄。如果至少有一條記錄返回,那麼EXISTS的結果是”true”,如果子查詢沒有返回記錄,那麼EXISTS的結果是”false”。
EXISTS(subquery)子查詢可以參考從它周圍查詢傳遞的變數,這樣在運行子查詢的時候,可以像一個常量那樣操作。
通常執行子查詢來確定是否至少有一條記錄返回,而不是返回的所有記錄才結束子查詢。寫一個有負作用的子查詢(例如調用序列函數)是不明智的,而是否有負作用是很難預先判斷出來的。
因為EXISTS的返回結果只取決於是否有記錄返回,而不是這些記錄的內容,子查詢的輸出資料行表一般來說沒什麼意義。一般比較通用的編碼約定是以EXISTS(SELECT 1 WHERE…)的形式寫所有的EXISTS測試。當然,對於這個規則來說,也有些例外的情況,例如使用INTERSECT的子查詢。
這個樣本和在列deptno上進行的內串連類似,但是對於每個表dept的記錄來說最多隻產生一條輸出記錄,儘管這裡有多條匹配的表emp的記錄:
SELECT dname FROM dept WHERE EXISTS (SELECT 1 FROM emp WHERE emp.deptno = dept.deptno);
dname
------------
ACCOUNTING
RESEARCH
SALES
(3 rows)IN
操作符IN在右側是括弧中的子查詢,這個子查詢必須只返回一列的內容。計算操作符左側的運算式,然後與子查詢結果中的每條記錄進行比較。如果找到與子查詢中相匹配的記錄,那麼IN操作的結果是”true”。如果沒有相等記錄(包括像子查詢沒有返回記錄這種特定的情況)則結果是”false”。
expression IN (subquery)需要注意的是如果操作符左側的運算式產生空值,或者在操作符右側表中的記錄沒有與之相等的值,並且至少有一條右側子查詢返回的記錄產生空值,那麼IN構造的結果將是空值,而不是”false”。這和對於空值和布爾變數組合的SQL一般規則是一致的。
和EXISTS一樣,設想子查詢會完成對所有涉及記錄的查詢是不明智的。
NOT IN
在操作符右側的是括弧中的子查詢,這個子查詢必須只返回一列的內容。計算操作符左側的運算式,然後與子查詢結果中的每條記錄進行比較。如果只返回了與子查詢中不相等記錄(包括特定的情況,也就是子查詢沒有返回記錄),那麼NOT IN操作的結果是”true”。如果找到相同的記錄,那麼返回結果是”false”。
expression NOT IN (subquery)需要注意的是如果操作符左側的運算式產生空值,或者在操作符右側表中的記錄沒有與之相等的值,並且操作符右側子查詢至少返回一條產生空值的記錄,那麼 NOT IN 構造的結果將是空值,而不是“true”。這和對於空值和布爾變數組合的SQL一般規則是一致的。
正如和EXISTS一樣,設想子查詢會完成對所有涉及記錄的查詢是不明智的。
ANY/SOME
在操作符右側是括弧中的子查詢,這個子查詢必須只返回一列的內容。計算操作符左側的運算式,然後使用給定的操作符和子查詢結果的每條記錄進行比較,最後產生一個BOOLEAN類型的結果。如果取出了傳回值為真的結果,那麼ANY操作的結果是”true”。如果沒有找到傳回值為真的結果(包括子查詢沒有返回記錄這種特定的情況),那麼結果為”false”。
expression operator ANY (subquery)
expression operator SOME (subquery)SOME是ANY的同義字。IN等同於'= ANY'。
需要注意的是如果這裡沒有成功返回的記錄,並且操作符右側的運算式至少有一行記錄對於操作符的結果產生了空值,那麼ANY操作構造的結果將是空,而不是”false”。這和對於空值和布爾變數組合的SQL一般規則是一致的。
正如和EXISTS一樣,設想子查詢會完成對所有涉及記錄的查詢是不明智的。
ALL
在操作符右側的是括弧中的子查詢,這個子查詢必須只返回一列的內容。計算操作符左側的運算式, 然後使用給定的操作符和子查詢結果的每條記錄進行比較,最後產生一個BOOLEAN類型的結果。如果和所有記錄的比較結果都是真(包括子查詢沒有返回記錄這種特殊情況),那麼ALL操作的結果是“true”。如果找到任何比較結果為“false”的記錄,那麼ALL操作的結果是“false”。如果比較操作對於任何記錄不返回“false”,並且為至少一條記錄返回空值,那麼最後結果是“空值”。
expression operator ALL (subquery)NOT IN 等同於 ‘<> ALL’。
正如和EXISTS一樣,設想子查詢會完成對所有涉及記錄的查詢是不明智的。