CodeGym /Corsi /SQL SELF /Lavorare con i valori NULL durante il join ...

Lavorare con i valori NULL durante il join dei dati

SQL SELF
Livello 12 , Lezione 0
Disponibile

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?

  1. Sostituisci NULL con valori più chiari usando COALESCE()

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?

  1. 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.

  1. Contare considerando NULL: esempio con COUNT

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;
  1. 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.

  1. Usa INNER JOIN se sei sicuro che non ci siano NULL

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.

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION