之间的区别:NOT IN(IS NOT NULL)VS IN(IS NULL)

Adr*_*los 0 sql oracle subquery

我试图编写一个查询来列出没有任何员工的部门的ID和名称.我找到了一个有效的查询,但我不明白为什么我的方法不起作用.

除了WHERE子句中的子查询之外,两个查询都是相同的.

我的工作方法:IN ... IS NULL(编辑:它没有回报价值)

SELECT
    department_id,
    department_name
FROM
    departments
WHERE
    department_id IN ( 
        SELECT
            department_id
        FROM
            employees
        WHERE
            department_id IS NULL
    )
ORDER BY
    department_name;
Run Code Online (Sandbox Code Playgroud)

WORKING方法:NOT IN ...不是NULL

SELECT
    department_id,
    department_name
FROM
    departments
WHERE
    department_id NOT IN ( --why -> IN... IS NULL is not working?
        SELECT
            department_id
        FROM
            employees
        WHERE
            department_id IS NOT NULL
    )
ORDER BY
    department_name;
Run Code Online (Sandbox Code Playgroud)

D S*_*ley 5

NULL == NULL从来都不是真的.所以你问是否department_id在一组department_ids中的哪个department_id是NULL.这绝不是真的.在第二个查询中,您正在查找不在department_ids列表中的department_ids,其中department_idnot不是NULL.这将为您提供不在表中的NULL department_id和AND .department_idemployees

我会注意到子查询中的WHERE子句不是必需的:

WHERE
department_id NOT IN (
    SELECT department_id FROM employees
)
Run Code Online (Sandbox Code Playgroud)