W tabeli Koty kolumna wlasciciel w części wierszy ma wartość NULL. Które zapytanie policzy tylko te koty, które mają wpisanego właściciela?
SELECT COUNT(*) FROM Koty WHERE wlasciciel = NULL;
= NULL nigdy nie jest prawdziwe, więc wynik zawsze wynosi 0. Do tego służy IS NULL.SELECT COUNT(*) FROM Koty;
COUNT(*) liczy wszystkie wiersze, także koty bez właściciela.SELECT SUM(wlasciciel) FROM Koty;
SUM dodaje wartości kolumny, a nie liczy wierszy.SELECT COUNT(wlasciciel) FROM Koty;
COUNT(wlasciciel) pomija wiersze z NULL, więc liczy tylko koty z wpisanym właścicielem.Funkcja COUNT z nazwą kolumny w nawiasie liczy tylko te wiersze, w których ta kolumna ma wartość, czyli nie jest NULL. COUNT(wlasciciel) pominie więc koty bez właściciela i zwróci dokładnie liczbę kotów z wpisanym właścicielem.
Ta różnica jest częstym źródłem pomyłek w raportach: COUNT(*) liczy wszystkie wiersze, a COUNT(kolumna) tylko niepuste. Ten sam wynik da zapis z warunkiem: SELECT COUNT(*) FROM Koty WHERE wlasciciel IS NOT NULL;. Funkcje SUM, AVG, MIN i MAX również pomijają NULL. Na przykład AVG(ocena) liczy średnią tylko z wpisanych ocen, a nie traktuje braków jak zer.
COUNT(*) liczy wszystkie wiersze tabeli, bez względu na zawartość kolumn. To dobre zapytanie, gdy pytamy o liczbę wszystkich kotów, ale tutaj koty bez właściciela wejdą do wyniku i liczba będzie za duża.
Wiele osób wybiera warunek wlasciciel = NULL, bo wygląda logicznie. W SQL żadne porównanie ze znakiem równości nie daje prawdy dla NULL, bo NULL oznacza wartość nieznaną. Taki warunek nie przepuści żadnego wiersza i zapytanie zawsze zwróci 0. Do sprawdzania braku wartości służą IS NULL i IS NOT NULL. Zresztą nawet poprawne IS NULL policzyłoby koty bez właściciela, czyli odwrotnie, niż chce treść.
SUM dodaje wartości zamiast je liczyć. Na kolumnie z imionami czy nazwiskami właścicieli wynik nie ma sensu i nie odpowiada liczbie kotów.
Wartość NULL to brak danych, a nie zero ani pusty napis.