在本教學中,您將學習如何使用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
,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
運算符從一個數據中減去另一組數據。
上一篇:
Oracle Exists運算符
下一篇:
Oracle Any/Some運算符