SQL Server Exists運算符

在本教學中,將學習如何在條件中使用SQL Server EXISTS運算符來測試子查詢中是否存在行。

SQL Server EXISTS運算符概述

EXISTS運算符是一個邏輯運算符,用於檢查子查詢是否返回任何行。 如果子查詢返回一行或多行,則EXISTS運算符返回TRUE

以下是SQL Server EXISTS運算符的語法:

EXISTS ( subquery)

在此語法中,子查詢僅是SELECT語句。子查詢返回行後,EXISTS運算符返回TRUE並立即停止處理。

請注意,即使子查詢返回NULL值,EXISTS運算符也會計算為TRUE

SQL Server EXISTS運算符示例

讓我們舉一些例子來瞭解EXISTS運算符的工作原理。

1. 帶子查詢的EXISTS返回NULL示例

請參閱示例資料庫中的customers表。

Exists返回NULL示例

以下示例返回customers表中的所有行:

SELECT
    customer_id,
    first_name,
    last_name
FROM
    sales.customers
WHERE
    EXISTS (SELECT NULL)
ORDER BY
    first_name,
    last_name;

執行上面查詢語句,得到以下結果:

在此示例中,子查詢返回包含NULL的結果集,這也導致EXISTS運算符計算為TRUE

1.2. EXISTS帶有相關子查詢示例

考慮以下customersorders表,它們的結構如下所示:

以下示例查找已下過兩個以上訂單的所有客戶:

SELECT
    customer_id,
    first_name,
    last_name
FROM
    sales.customers c
WHERE
    EXISTS (
        SELECT
            COUNT (*)
        FROM
            sales.orders o
        WHERE
            customer_id = c.customer_id
        GROUP BY
            customer_id
        HAVING
            COUNT (*) > 2
    )
ORDER BY
    first_name,
    last_name;

執行上面查詢語句,得到以下結果:
EXISTS帶有相關子查詢示例

在這個例子中,我們有一個相關的子查詢,它返回下過兩個以上訂單的客戶。

如果客戶下達的訂單數小於或等於2,則子查詢返回一個空結果集,該結果集導致EXISTS運算符計算為FALSE

根據EXISTS運算符的結果,客戶是否包含在結果集中。

1.3. EXISTS 與 IN示例

以下語句使用IN運算符查找城市為San Jose的客戶訂單:

SELECT
    *
FROM
    sales.orders
WHERE
    customer_id IN (
        SELECT
            customer_id
        FROM
            sales.customers
        WHERE
            city = 'San Jose'
    )
ORDER BY
    customer_id,
    order_date;

以下語句使用返回相同結果的EXISTS運算符:

SELECT
    *
FROM
    sales.orders o
WHERE
    EXISTS (
        SELECT
            customer_id
        FROM
            sales.customers c
        WHERE
            o.customer_id = c.customer_id
        AND city = 'San Jose'
    )
ORDER BY
    o.customer_id,
    order_date;

執行上面查詢語句,得到以下結果:
EXISTS 與 IN示例

1.4. EXISTS與JOIN

JOIN子句從另一個表返回行記錄,EXISTS運算符返回TRUEFALSE

可以使用EXISTS運算符來測試子查詢是否返回行,並儘快進行短路。 另一方面,使用JOIN將結果集與另一個相關表中的列組合來擴展結果集。


上一篇: SQL Server子查詢語句 下一篇: SQL Server集合操作符