Örnek üzerinden gidelim (böyle bir veritabanımızın olduğunu düşünelim) ;

ID - AD - tel
1 - ilker - 0552xxx
2 - ahmet - (yok NULL)

WHERE tel IS NULL > ahmeti getirecektir
WHERE tel IS NOT NULL" > ilkeri getirecektir
WHERE tel <> '' > ilkeri getirecektir
WHERE tel != "" > ilkeri getirecektir
WHERE tel = '' > hiç bir veri getirmeyecektir (buraya dikkat) bizim ahmet adlı değerimiz NULL yani hiç bir zaman veri eklenmemiş bir değere sahip o yüzden olmayanı getiremeyiz. = '' dersek eğer bir boş string atmış oluruz bizim hiç bir dize değerimiz olmadığı için ahmette beraber hiç bir sonuç dönmeyecektir. Taa ki ahmet değeri NULL değerinden çıkarılıp boş bir string atılana kadar. Yani NULL değeri ile boş string farklı bir şeydir.

WHERE tel IN ('0552xxx') > ilkeri getirecektir
(IN Sorgusunda hedef sütununda aranacak değer net olmalıdır. Bu tel='0552xxx' ile aynıdır. Tek farklı sürekli eşittir kullanmaktansa birden fazla veriyi çekmek istiyorsanız IN ile bunu başarabilirsiniz. Yani bir şehir tablomuz var. hedef sütun ilce. ilce IN('Samsun', 'İzmir') diyerek ilcesi Samsun ve İzmir olanları getirecektir. )

NOT IN ise tam tersi belirtilen değerler "gelmesin" gibi.

Hız faktörü olarak;

IS NULL, = '' Bundan hızlıdır.
Sebebi MySQLde belirli kalıpların olması. NULL bilindik bir methoddur. Ama sizin belirlediğiniz tırnak içerisinde yazılan string program tarafından bilinmez talep olarak atılır. Tek tek sorgu yapar.

Bu yüzden boş olan değerleri x = '' yerine x IS NULL derseniz boş olanları daha hızlı getirecektir.

Aynı şey IS NOT NULL içinde geçerli zaten ingilizce tabirden NOT'ın ne işe yaradığını belli ediyor. IS NULL > boş olanları, IS NOT NULL > boş olmayanları getir gibi.