Oracle Not Exists運算符

在本教學中,您將學習如何使用Oracle NOT EXISTS運算符從一個數據中減去另一組數據集。

Oracle NOT EXISTS運算符簡介

NOT EXISTS運算符與EXISTS運算符相反。我們經常在子查詢中使用NOT EXISTS運算符來從一個數據中減去另一組數據。

看一下使用NOT EXISTS運算符的以下語句:

SELECT
    *
FROM
    table_name
WHERE
    NOT EXISTS (subquery);

如果子查詢不返回任何行,則NOT EXISTS運算符返回true。 否則,它返回false

請注意,如果子查詢返回任何具有NULL值的行,則NOT EXISTS運算符將返回false

Oracle NOT EXISTS例子

請參閱示例資料庫中的以下客戶(customers)和訂單(orders)表:

以下語句查找所有沒有訂單的客戶:

SELECT
    name
FROM
    customers
WHERE
    NOT EXISTS (
        SELECT
            NULL
        FROM
            orders
        WHERE
            orders.customer_id = customers.customer_id
    )
ORDER BY
    name;

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

要查詢歸檔沒有訂單的客戶,請使用以下語句:

CREATE TABLE customers_archive AS
SELECT *
FROM
    customers
WHERE
    NOT EXISTS (
        SELECT
            NULL
        FROM
            orders
        WHERE
            orders.customer_id = customers.customer_id
    );

執行上面查詢語句後,再查詢customers_archive表中的數據,得到以下結果 -

要更新2017年沒有訂單的客戶的信用額度,請使用以下UPDATE語句:

UPDATE
    customers
SET
    credit_limit = 0
WHERE
    NOT EXISTS(
        SELECT
            NULL
        FROM
            orders
        WHERE
            orders.customer_id = customers.customer_id
            AND EXTRACT(YEAR FROM order_date)='2017'
    );

要從customers表中刪除2016年和2017年沒有訂單的所有客戶,請使用以下DELETE語句:

DELETE
FROM
    customers
WHERE
    NOT EXISTS(
        SELECT
            NULL
        FROM
            orders
        WHERE
            orders.customer_id = customers.customer_id
            AND EXTRACT(YEAR FROM order_date
            ) IN(
                2016,
                2017
            )
    );

Oracle NOT EXISTS與NOT IN

以下語句對子查詢使用IN運算符:

SELECT
 *
FROM
    table_name
WHERE
    id IN(subquery);

假設子查詢返回四個值:1,2,3NULL。可以重寫上面的整個查詢,如下所示:

SELECT
    *
FROM
    table_name
WHERE
    id = 1
    OR id = 2
    OR id = 3
    OR id = NULL;

下麵的運算式總是返回一個NULL值,因為NULL值不能和任何東西比較。

id = NULL

因此,如果子查詢的結果集中的任何行為NULL,則以下運算式將返回NULL值。

id NOT IN (subquery)

相比之下,NULL不會影響NOT EXIST運算符的結果,因為NOT EXISTS運算符僅檢查子查詢中是否存在行:

SELECT
    *
FROM
    table_name
WHERE
    NOT EXISTS(subquery);

總而言之,當存在NULL值時,NOT EXISTSNOT IN的行為會有所不同。

在本教學中,您已學習如何使用Oracle NOT EXISTS運算符從一個數據中減去另一組數據。


上一篇: Oracle Exists運算符 下一篇: Oracle Any/Some運算符