Wydaje się to takie proste, jestem oszołomiony z powodu braku lepszego słowa. Mam dwie tabele, nazwijmy je albums
i artists
Null i IN() dostarczają nieoczekiwanych wyników.
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`)
)
Istnieje kilkaset tysięcy reconds w każdej tabeli. Niektóre wiersze albumów mają wartość zerową artist_id
, to jest oczekiwane.
Jednak, kiedy należy wykonać następujące zapytanie znaleźć artystów bez albumach:
SELECT * FROM artists WHERE artist_id NOT IN (SELECT artist_id FROM albums)
... kwerenda zwraca zero wyników. Wiem, że to nie jest prawda. Spróbowałem więc ten jeden:
SELECT * FROM artists WHERE artist_id NOT IN (SELECT artist_id FROM albums WHERE artist_id IS NOT NULL)
... i wrócić kilka tysięcy wierszy. Moje pytanie brzmi: dlaczego pierwsze zapytanie zdało się działać na idei, że jakakolwiek liczba = NULL? Czy jest to dziwny efekt, który NULL ma na oświadczeniu IN()
? Czuję, że jest to coś podstawowego, czego mi brakowało. Zazwyczaj nie używam NULL w moich tabelach db.
Wygląda na to, że NOT EXISTS również było marginalnie szybsze. Dziękuję bardzo za informacje! –