暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle Not Exists运算符

原创 起鼓隆冬强 2023-11-16
389

Oracle NOT EXISTS运算符简介

NOT EXISTS运算符与EXISTS运算符相反。我们经常在子查询中使用NOT EXISTS运算符来从一个数据中减去另一组数据。

看一下使用NOT EXISTS运算符的以下语句:

SELECT
    *
FROM
    table_name
WHERE
    NOT EXISTS (subquery);

SQL

如果子查询不返回任何行,则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;

SQL

执行上面查询语句,得到以下结果 -

要查询归档没有订单的客户,请使用以下语句:

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

SQL

执行上面查询语句后,再查询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'
    );

SQL

要从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
            )
    );

SQL

Oracle NOT EXISTS与NOT IN

以下语句对子查询使用IN运算符:

SELECT
 *
FROM
    table_name
WHERE
    id IN(subquery);

SQL

假设子查询返回四个值:1,2,3NULL。可以重写上面的整个查询,如下所示:

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

SQL

下面的表达式总是返回一个NULL值,因为NULL值不能和任何东西比较。

id = NULL

SQL

因此,如果子查询的结果集中的任何行为NULL,则以下表达式将返回NULL值。

id NOT IN (subquery)

SQL

相比之下,NULL不会影响NOT EXIST运算符的结果,因为NOT EXISTS运算符仅检查子查询中是否存在行:

SELECT
    *
FROM
    table_name
WHERE
    NOT EXISTS(subquery);

SQL

总而言之,当存在NULL值时,NOT EXISTSNOT IN的行为会有所不同。

在本教程中,您已学习如何使用Oracle NOT EXISTS运算符从一个数据中减去另一组数据。



「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论