SQL IS NULL

SQL IS NULL


    


DEFINICJA

Polecenie IS NULL jest związane z wartością NULL, czyli z wartością nieznaną (więcej o wartości NULL tutaj). Za pomocą polecenia IS NULL możemy np. wyszukać  wartości NULL w bazie (przykład poniżej) .


Przykład zastosowania IS NULL (baza AdventureWorks) 

Wyświetl pracowników (z tabeli Person.Person) którzy NIE mają drugiego imienia.

SELECT
     FirstName AS Imię
    ,MiddleName AS [Drugie imię]
    ,LastName AS Nazwisko
FROM
    Person.Person    
WHERE
    MiddleName IS NULL
    AND (PersonType = 'EM' OR PersonType = 'SP')

Żeby uzyskać prawidłowy wynik w części WHERE musimy dodać warunek MiddleName IS NULL, co można zinterpretować tak: pokaż mi wszystkie rekordy z pracownikami gdzie pole MiddleName JEST PUSTE, czyli którzy pracownicy NIE mają drugiego imienia.


lub filtrować wyniki zapytania do rekordów które w wynikach mają wartość NULL (przykład poniżej).

Przykład zastosowania IS NULL (baza AdventureWorks) 

Wyświetl listę produktów które NIE były ani razu, użyte w zamówieniach (bo wiadomo, że nie każdy produkt z asortymentu musi być zamówiony).

Na początek żeby pokazać Wam jak wykorzystując wartości NULL możemy rozwiązać ten problem.

Połączmy dwie tabele Production.Product z tabelą Sales.SalesOrderDetails za pomocą polecenia LEFT JOIN. Jeżeli produkt nie znalazł się w żadnym z zamówień w ostatniej kolumnie wyniku zapytania pojawi nam się wartość NULL

Zapytanie:

SELECT
     P.ProductID
    ,P.Name
    ,P.ProductNumber
    ,D.ProductID
FROM
    Production.Product P
    LEFT JOIN Sales.SalesOrderDetail D ON P.ProductID = D.ProductID

Zrzut z częścią wyniku:

kurs sql is not null

Żeby nie zaciemniać wyników wyświetliłem tylko cztery kolumny. W ostatniej wyświetliłem ID produktu z tabeli Sales.SalesOrderDetails. Jeżeli system nie znalazł dopasowania produtku do żadnego z zamówień to wyświetla NULL a jeżeli znalazł takie dopasowanie to wyświetlane jest ID produktu z zamówienia (oczywiście ID produktu z kolumny 1 i 4 powinny być takie same).

Jeżeli teraz chcemy wyświetlić tylko te produtkty, które nigdy NIE znalazły się w zamówieniach musimy dodać warunek: pokaż produkty które w polu ProductID (z tabeli Sales.SalesOrderDetails) ma wartość NULL, czyli nasze zapytanie przybierze formę.

SELECT
     P.ProductID
    ,P.Name
    ,P.ProductNumber
    ,D.ProductID
FROM
    Production.Product P
    LEFT JOIN Sales.SalesOrderDetail D ON P.ProductID = D.ProductID
WHERE
    D.ProductID IS NULL    
GROUP BY
    P.ProductID, P.Name, P.ProductNumber, D.ProductID