Null и IN () дают неожиданные результаты

Это кажется таким простым, я ошеломлен отсутствием лучшего слова . У меня есть две таблицы, назовем их альбомы и исполнители

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 artist WHERE artist_id NOT IN (SELECT artist_id FROM album)

... запрос возвращает ноль результатов . Я знаю, что это неправда. Поэтому я попробовал это:

ВЫБРАТЬ * ИЗ артистов, ГДЕ artist_id НЕ ВХОДИТ (ВЫБРАТЬ artist_id ИЗ альбомов, ГДЕ artist_id НЕ ПУСТОЙ)

... и я верну пару тысяч строк. Мой вопрос: почему первый запрос, похоже, основывался на идее, что любое число = NULL? Или это странный эффект, который NULL оказывает на IN () sta tement? Я чувствую, что это что-то базовое, чего я упустил. Обычно я вообще не использую NULL в своих таблицах db.

6
задан Chris Baker 29 July 2011 в 14:47
поделиться