在本教學中,您將學習如何使用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
。
請參閱範例資料庫中的以下客戶(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
)
);
以下語句對子查詢使用IN運算子:
SELECT
*
FROM
table_name
WHERE
id IN(subquery);
假設子查詢返回四個值:1
,2
,3
和NULL
。可以重寫上面的整個查詢,如下所示:
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 EXISTS
和NOT IN
的行為會有所不同。
在本教學中,您已學習如何使用Oracle NOT EXISTS
運算子從一個資料中減去另一組資料。