Immagina di fare il join di due tabelle: students (studenti) e enrollments (iscrizioni ai corsi). Se nella tabella enrollments non c’è info su uno studente, ma usi per esempio LEFT JOIN, le righe dalla tabella students appaiono comunque, ma i dati da enrollments mancano. In questi casi, invece di dati specifici, compare NULL.
Più o meno così:
Tabella students:
| id | name |
|---|---|
| 1 | Eva |
| 2 | Peter |
| 3 | Anna |
Tabella enrollments:
| student_id | course_name |
|---|---|
| 1 | Matematica |
| 1 | Informatica |
| 2 | Fisica |
Query con LEFT JOIN:
SELECT students.id, students.name, enrollments.course_name
FROM students
LEFT JOIN enrollments ON students.id = enrollments.student_id;
Risultato:
| id | name | course_name |
|---|---|---|
| 1 | Eva | Matematica |
| 1 | Eva | Informatica |
| 2 | Peter | Fisica |
| 3 | Anna | NULL |
Ecco qui, ciao NULL! Come vedi, per Anna, che non è iscritta a nessun corso, manca l’info sul corso e viene fuori NULL al posto di qualsiasi cosa.
Come NULL influenza le query?
NULL non è "zero" e non è una "stringa vuota", è proprio assenza di valore. Questo comportamento ha alcune conseguenze interessanti (e a volte fastidiose):
Confronti con NULL:
Se scrivi qualcosa tipo WHERE course_name = NULL, la query non ti restituisce righe con NULL. Perché? Perché non puoi confrontare direttamente i valori con NULL.
Per controllare se c’è NULL, devi usare operatori speciali:
WHERE course_name IS NULL
Operazioni matematiche:
Qualsiasi operazione con NULL restituisce NULL. Tipo:
SELECT 5 + NULL; -- risultato: NULL
Funzioni di aggregazione:
La maggior parte delle funzioni di aggregazione, come SUM(), AVG(), ignora NULL, ma COUNT(*) li conta come "righe esistenti".
Come gestire NULL?
- Sostituisci
NULLcon valori più chiari usandoCOALESCE()
La funzione COALESCE() ti permette di sostituire NULL con un altro valore. Per esempio, se manca il corso, puoi mettere "Nessun corso":
SELECT
students.id,
students.name,
COALESCE(enrollments.course_name, 'Nessun corso') AS course_name
FROM
students LEFT JOIN enrollments
ON students.id = enrollments.student_id;
Risultato:
| id | name | course_name |
|---|---|---|
| 1 | Eva | Matematica |
| 1 | Eva | Informatica |
| 2 | Peter | Fisica |
| 3 | Anna | Nessun corso |
Adesso è molto meglio, vero?
- Filtrare i valori
NULL
Se non vuoi vedere le righe con NULL, puoi usare la condizione WHERE ... IS NOT NULL. Tipo:
SELECT
students.id,
students.name,
enrollments.course_name
FROM
students LEFT JOIN enrollments
ON students.id = enrollments.student_id
WHERE
enrollments.course_name IS NOT NULL;
Risultato:
| id | name | course_name |
|---|---|---|
| 1 | Eva | Matematica |
| 1 | Eva | Informatica |
| 2 | Peter | Fisica |
Anna sparisce dal risultato, perché non ha iscrizioni ai corsi.
- Contare considerando
NULL: esempio conCOUNT
Come detto prima, alcune funzioni ignorano NULL, altre no. Per esempio:
Per contare tutte le righe, anche quelle dove c’è NULL:
SELECT COUNT(*) FROM students; -- Conta TUTTE le righe (anche dove `course_name` = NULL)
Per contare solo le righe dove non c’è NULL:
SELECT COUNT(course_name) FROM enrollments;
- Espressioni condizionali con
CASE
Se COALESCE() non ti piace o vuoi più flessibilità, prova a usare CASE. Tipo:
SELECT
students.id,
students.name,
CASE
WHEN enrollments.course_name IS NULL THEN 'Nessun corso'
ELSE enrollments.course_name
END AS course_name
FROM
students LEFT JOIN enrollments
ON students.id = enrollments.student_id;
Il risultato sarà lo stesso che con COALESCE(), ma CASE ti permette di scrivere regole più complesse.
- Usa
INNER JOINse sei sicuro che non ci sianoNULL
Il modo più radicale per evitare NULL è non farli apparire proprio, usando INNER JOIN. Questo tipo di join restituisce solo le righe che hanno corrispondenza in entrambe le tabelle:
SELECT
students.id,
students.name,
enrollments.course_name
FROM
students INNER JOIN enrollments
ON students.id = enrollments.student_id;
Nessuna sorpresa — solo studenti iscritti ai corsi.
Risultato:
| id | name | course_name |
|---|---|---|
| 1 | Eva | Matematica |
| 1 | Eva | Informatica |
| 2 | Peter | Fisica |
Se i tuoi dati richiedono di mostrare tutti i valori, inclusi i NULL, INNER JOIN non va bene, ma a volte è tutto quello che ti serve.
GO TO FULL VERSION