基于 SQL 中的 EXISTS 運算符為我們提供了一種基于其他數據是否存在(或不存在)來檢索數據的簡便方法。更具體地說,它是一個邏輯運算符,用于評估子查詢的結果,并返回一個布爾值,該值指示是否返回了行。盡管 IN 運算符可用于類似的目的,但需要注意它們之間的一些差異。今天的博客將介紹如何使用 EXISTS 運算符的幾個示例,并提供一些指導,說明何時應使用 EXISTS 而不是 IN。
EXISTS 在實踐中的應用
盡管 EXISTS 運算符可以在 SELECT、UPDATE、INSERT 或 DELETE 語句中使用,但為了保持簡單,我們將重點介紹 SELECT 查詢。因此,我們將使用的語法將非常類似于以下形式:
我們將在 PostgreSQL 的幾個表上執行我們的查詢——比如客戶和賬戶表,這些表在銀行數據庫中很常見。下面是在 Navicat for PostgreSQL 網格視圖中顯示的這些表:
現在,我們可以使用以下查詢來查看所有具有與其 customer_id 相關聯的賬戶的客戶:
以下是在 Navicat Premium 的查詢編輯器中執行上述查詢的結果:
使用 NOT EXISTS
相反地,在 EXISTS 運算符前加上 NOT 關鍵字會導致查詢只選擇子查詢中沒有匹配行的記錄。我們可以使用 NOT EXISTS 來檢索所有孤立的賬戶,即沒有關聯客戶的賬戶:
由于客戶表中沒有該 ID 的客戶,所以它返回了客戶 #4 的賬戶。
用 Joins 替換 EXISTS
使用 EXISTS 運算符的查詢可能執行起來有點慢,因為子查詢需要對外層查詢的每一行都執行一次。因此,你應該盡可能考慮使用連接。事實上,我們可以使用 LEFT JOIN 來重寫上面的EXISTS 查詢:
IN vs EXISTS 運算符
盡管 IN 運算符通常用于為列的某個值列表設置過濾器,但它也可以應用于子查詢的結果。以下是我們第一個查詢的等效查詢,但這次使用的是 IN 而不是 EXISTS:
請注意,我們只能選擇想要進行比較的列,而不能選擇 SELECT *。不過,IN 查詢會產生相同的結果:
由于這兩個操作符非常相似,數據庫開發人員往往不確定應該使用哪一個。一般來說, 當你想根據特定值列表篩選行時,應該使用 IN 操作符。當你想檢查子查詢中是否存在滿足某些條件的行時,應該使用 EXISTS。