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運算子從一個資料中減去另一組資料。