這個(gè)部分介紹了在PolarDB中遵循SQL標(biāo)準(zhǔn)的子查詢表達(dá)式。所有在這部分提到的表達(dá)式返回值都是布爾類型(真/假)結(jié)果。

EXISTS

EXISTS的參數(shù)是一條以任意形式出現(xiàn)的SELECT語句或者子查詢。首先運(yùn)行子查詢語句來決定這個(gè)子查詢語句是否返回記錄。如果至少有一條記錄返回,那么EXISTS的結(jié)果是”true”,如果子查詢沒有返回記錄,那么EXISTS的結(jié)果是”false”。

EXISTS(subquery)

子查詢可以參考從它周圍查詢傳遞的變量,這樣在運(yùn)行子查詢的時(shí)候,可以像一個(gè)常量那樣操作。

通常執(zhí)行子查詢來確定是否至少有一條記錄返回,而不是返回的所有記錄才結(jié)束子查詢。寫一個(gè)有負(fù)作用的子查詢(例如調(diào)用序列函數(shù))是不明智的,而是否有負(fù)作用是很難預(yù)先判斷出來的。

因?yàn)镋XISTS的返回結(jié)果只取決于是否有記錄返回,而不是這些記錄的內(nèi)容,子查詢的輸出列表一般來說沒什么意義。一般比較通用的編碼約定是以EXISTS(SELECT 1 WHERE…)的形式寫所有的EXISTS測試。當(dāng)然,對于這個(gè)規(guī)則來說,也有些例外的情況,例如使用INTERSECT的子查詢。

這個(gè)示例和在列deptno上進(jìn)行的內(nèi)連接類似,但是對于每個(gè)表dept的記錄來說最多只產(chǎn)生一條輸出記錄,盡管這里有多條匹配的表emp的記錄:

SELECT dname FROM dept WHERE EXISTS (SELECT 1 FROM emp WHERE emp.deptno = dept.deptno);

   dname
------------
 ACCOUNTING
 RESEARCH
 SALES
(3 rows)

IN

操作符IN在右側(cè)是括號中的子查詢,這個(gè)子查詢必須只返回一列的內(nèi)容。計(jì)算操作符左側(cè)的表達(dá)式,然后與子查詢結(jié)果中的每條記錄進(jìn)行比較。如果找到與子查詢中相匹配的記錄,那么IN操作的結(jié)果是”true”。如果沒有相等記錄(包括像子查詢沒有返回記錄這種特定的情況)則結(jié)果是”false”。

expression IN (subquery)

需要注意的是如果操作符左側(cè)的表達(dá)式產(chǎn)生空值,或者在操作符右側(cè)表中的記錄沒有與之相等的值,并且至少有一條右側(cè)子查詢返回的記錄產(chǎn)生空值,那么IN構(gòu)造的結(jié)果將是空值,而不是”false”。這和對于空值和布爾變量組合的SQL一般規(guī)則是一致的。

和EXISTS一樣,設(shè)想子查詢會(huì)完成對所有涉及記錄的查詢是不明智的。

NOT IN

在操作符右側(cè)的是括號中的子查詢,這個(gè)子查詢必須只返回一列的內(nèi)容。計(jì)算操作符左側(cè)的表達(dá)式,然后與子查詢結(jié)果中的每條記錄進(jìn)行比較。如果只返回了與子查詢中不相等記錄(包括特定的情況,也就是子查詢沒有返回記錄),那么NOT IN操作的結(jié)果是”true”。如果找到相同的記錄,那么返回結(jié)果是”false”。

expression NOT IN (subquery)

需要注意的是如果操作符左側(cè)的表達(dá)式產(chǎn)生空值,或者在操作符右側(cè)表中的記錄沒有與之相等的值,并且操作符右側(cè)子查詢至少返回一條產(chǎn)生空值的記錄,那么 NOT IN 構(gòu)造的結(jié)果將是空值,而不是“true”。這和對于空值和布爾變量組合的SQL一般規(guī)則是一致的。

正如和EXISTS一樣,設(shè)想子查詢會(huì)完成對所有涉及記錄的查詢是不明智的。

ANY/SOME

在操作符右側(cè)是括號中的子查詢,這個(gè)子查詢必須只返回一列的內(nèi)容。計(jì)算操作符左側(cè)的表達(dá)式,然后使用給定的操作符和子查詢結(jié)果的每條記錄進(jìn)行比較,最后產(chǎn)生一個(gè)BOOLEAN類型的結(jié)果。如果取出了返回值為真的結(jié)果,那么ANY操作的結(jié)果是”true”。如果沒有找到返回值為真的結(jié)果(包括子查詢沒有返回記錄這種特定的情況),那么結(jié)果為”false”。

expression operator ANY (subquery) 
expression operator SOME (subquery)

SOME是ANY的同義詞。IN等同于'= ANY'。

需要注意的是如果這里沒有成功返回的記錄,并且操作符右側(cè)的表達(dá)式至少有一行記錄對于操作符的結(jié)果產(chǎn)生了空值,那么ANY操作構(gòu)造的結(jié)果將是空,而不是”false”。這和對于空值和布爾變量組合的SQL一般規(guī)則是一致的。

正如和EXISTS一樣,設(shè)想子查詢會(huì)完成對所有涉及記錄的查詢是不明智的。

ALL

在操作符右側(cè)的是括號中的子查詢,這個(gè)子查詢必須只返回一列的內(nèi)容。計(jì)算操作符左側(cè)的表達(dá)式, 然后使用給定的操作符和子查詢結(jié)果的每條記錄進(jìn)行比較,最后產(chǎn)生一個(gè)BOOLEAN類型的結(jié)果。如果和所有記錄的比較結(jié)果都是真(包括子查詢沒有返回記錄這種特殊情況),那么ALL操作的結(jié)果是“true”。如果找到任何比較結(jié)果為“false”的記錄,那么ALL操作的結(jié)果是“false”。如果比較操作對于任何記錄不返回“false”,并且為至少一條記錄返回空值,那么最后結(jié)果是“空值”。

expression operator ALL (subquery)

NOT IN 等同于 ‘<> ALL’。

正如和EXISTS一樣,設(shè)想子查詢會(huì)完成對所有涉及記錄的查詢是不明智的。