gpt4 book ai didi

sql - Null和IN()提供意外结果

转载 作者:行者123 更新时间:2023-12-04 13:20:49 26 4
gpt4 key购买 nike

这似乎很基本,我为缺乏更好的词而感到惊讶。我有两个表,我们称它们为albumsartists

CREATE TABLE `albums` (
`album_id` bigint(20) NOT NULL AUTO_INCREMENT,
`artist_id` bigint(20) DEFAULT NULL,
`name` varchar(200) NOT NULL,
PRIMARY KEY (`album_id`)
)
CREATE TABLE `artists` (
`artist_id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(250) NOT NULL,
PRIMARY KEY (`artist_id`)
)

每个表中有几十万个搜索。某些专辑行的 artist_id为空,这是预期的。

但是,当我执行以下查询以查找没有专辑的艺术家时:
SELECT * FROM artists WHERE artist_id NOT IN (SELECT artist_id FROM albums)
...查询返回零结果。我知道这是不对的。所以我尝试了这个:
SELECT * FROM artists WHERE artist_id NOT IN (SELECT artist_id FROM albums WHERE artist_id IS NOT NULL)
...而我又返回了两千行。我的问题是:为什么第一个查询似乎是根据任何数字= NULL的想法操作的?还是这是NULL对 IN()语句产生的奇怪影响?我觉得这是我想念的基本知识。我通常根本不在我的数据库表中使用NULL。

最佳答案

这就是NOT EXISTS在语义上正确的原因

SELECT * FROM artists ar
WHERE NOT EXISTS
(SELECT * FROM albums al WHERE ar.artist_id = al.artist_id)

逻辑:
  • NOT IN (x, y, NULL)实际上是
  • NOT (x OR y OR NULL)实际上是
  • (NOT x) AND (NOT y) AND (NOT NULL)

  • 因此, NULL使整个 NOT IN无效

    关于sql - Null和IN()提供意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6874926/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com