Tepat. NULL mewakili nilai yang tidak diketahui, bukan nilai spesifik apa pun (tidak sama dengan NULL dalam C, atau nil di Ruby, dll.) Dalam SQL, jika Anda membandingkan sesuatu dengan nilai yang tidak diketahui, hasilnya juga tidak diketahui. Dan Anda tidak akan mendapatkan baris di mana WHERE kondisi tidak diketahui.
Coba ini:
SELECT NULL <> 2;
dan Anda akan melihat NULL sebagai hasilnya.
Coba ini:
SELECT * FROM t WHERE NULL;
dan tidak ada baris yang akan keluar, meskipun tabel t sangat besar.
Jika Anda benar-benar membutuhkan apa yang Anda inginkan (dan saya tidak menganjurkan ini), Anda dapat melakukan sesuatu seperti ini:
SELECT T.f1, T.f2
FROM (SELECT NULL f1, 'a' f2) T
WHERE ((T.f1 IS NULL OR T.f2 IS NULL)
AND (T.f1 IS NOT NULL OR T.f2 IS NOT NULL))
OR T.f1 <> T.f2