Это кажется таким простым, я ошеломлен отсутствием лучшего слова . У меня есть две таблицы, назовем их альбомы
и исполнители
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.