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