Lekcje modułu (2/4)
Obsługa wartości NULL: IS NULL i COALESCE
W zbiorze danych employees Andrea Costa jest kimś wyjątkowym: tak
KODEF1. Otarłeś się już o NULL (z
LEFT JOIN), ale nadszedł czas, aby potraktować to poważnie: NULL w SQL
zachowywać się odmiennie od wszelkich innych wartości, a ignorowanie ich jest jedną z nich
najczęstsze przyczyny błędów w kodzie produkcyjnym.
NULL nie jest zerem ani pustym ciągiem znaków
NULL oznacza nieznana/brakująca wartość. To nie jest 0, nie '', nie
KODEF3. To jest „nie wiem”. Z tego wynika zaskakująca właściwość:
NULL nie jest równy niczemu, nawet samemu sobie.
-- All these expressions return NULL (not true!):
SELECT NULL = NULL; -- NULL
SELECT NULL = 0; -- NULL
SELECT NULL <> 'qualcosa'; -- NULLKonkretna konsekwencja: WHERE column = NULL nigdy nie działa. Musisz użyć
dedykowani operatorzy IS NULL / IS NOT NULL:
-- Employees without a department:
SELECT first_name, last_name
FROM employees
WHERE department_id IS NULL;
-- Employees WITH a department:
SELECT first_name, last_name
FROM employees
WHERE department_id IS NOT NULL;COALESCE — rezerwa NULL
Często chcesz wyświetlić coś zamiast NULL, gdy dane są
brak: ciągu znaków '(none)', zero, data domyślna. Funkcja, która
robi dokładnie to COALESCE(a, b, c, ...): zwraca pierwszy
Argument inny niż NULL na liście.
-- Show the department_id, or 0 if missing:
SELECT first_name, last_name, COALESCE(department_id, 0) AS dept
FROM employees;W połączeniu z LEFT JOIN staje się niezwykle potężny w przypadku raportów:
SELECT e.first_name,
e.last_name,
COALESCE(d.name, '(nessun dipartimento)') AS dipartimento
FROM employees AS e
LEFT JOIN departments AS d ON e.department_id = d.id;Wynik: wszyscy pracownicy wrócili z nazwą działu lub jawnie Etykieta dla tych, którzy jej nie mają.
NULL i agregaty
Funkcje agregujące ignorują NULL (z wyjątkiem COUNT(*)):
COUNT(department_id)zlicza tylko wiersze z wartością;- średnie
AVG(salary)ignorująNULL— nie traktują ich jako 0; SUM(...)sumuje tylko wartości inne niż NULL.
Prawie zawsze tego chcesz. Ale dobrze jest wiedzieć: jeśli tak jest
szukając „całkowitej liczby pracowników” użyj COUNT(*), nie
KODEF1.
Spróbuj
Dla każdego pracownika pokaż imię (imię), nazwisko (nazwisko) i kolumnę „dipartimento_id”, która jest równa jego identyfikatorowi działu lub -1, jeśli nie jest przypisana. Trzy kolumny, jeden wiersz na pracownika.
Pokaż wskazówkę
Użyj COALESCE(id_departmentu, -1), aby zastąpić wartości NULL wartością -1.
Rozwiązanie dostępne po 3 próbach
Przejrzyj ćwiczenie
Zwróć imię (imię), nazwisko (nazwisko) i nazwę działu (departments.name) WSZYSTKICH pracowników, wyświetlając „(nessuno)”, gdy brakuje działu. Użyj LEWEGO DOŁĄCZENIA + ŁĄCZENIA.
Pokaż wskazówkę
COALESCE(d.name, '(nessuno)') obsługuje NULL wprowadzone przez LEFT JOIN.
Rozwiązanie dostępne po 3 próbach