Comportamento e gestione dei record contenenti valori NULL durante le operazioni di JOIN in SQL

In questo articolo verranno analizzati il comportamento dei record contenenti valori NULL durante le operazioni di JOIN in SQL e come gestirli. Nei database, i valori NULL rappresentano dati mancanti e, se inclusi nelle operazioni di JOIN, possono produrre risultati inattesi. Qui spiegheremo come comprendere il comportamento dei valori NULL nei vari tipi di JOIN e come gestirli correttamente per ottenere risultati accurati.

Indice

Comportamento di base dei valori NULL nelle operazioni di JOIN

Durante le operazioni di JOIN in SQL, i valori NULL vengono trattati in modo speciale. NULL indica l’assenza di un valore e, nelle operazioni di confronto, si comporta in modo diverso rispetto ai valori normali. In particolare, un confronto tra NULL e qualsiasi altro valore è sempre considerato falso. Di conseguenza, se una condizione di JOIN include NULL, quel record potrebbe non essere incluso nel set di risultati.

Nozioni di base sul confronto dei valori NULL

NULL significa “valore sconosciuto” e non viene considerato uguale a nessun altro valore durante i confronti. Ad esempio, la seguente query non restituirà record contenenti NULL:

SELECT *
FROM table1
JOIN table2 ON table1.column = table2.column;

In questa query, se la colonna di table1 o table2 contiene NULL, quella riga non sarà inclusa nel set di risultati.

Impatto dei record contenenti valori NULL sui risultati delle JOIN

L’impatto dei record contenenti valori NULL sui risultati delle JOIN varia a seconda del tipo di JOIN utilizzato. Questo sarà spiegato in dettaglio nella sezione successiva.

Gestione dei valori NULL nelle INNER JOIN

L’INNER JOIN include solo i record che soddisfano la condizione di JOIN, quindi i record contenenti valori NULL nelle chiavi di unione non saranno inclusi nel risultato. Questo può causare la perdita di dati inattesi.

Funzionamento di base dell’INNER JOIN

L’INNER JOIN combina solo i record che soddisfano la condizione da entrambe le tabelle. Vediamo un esempio:

SELECT *
FROM employees
INNER JOIN departments ON employees.department_id = departments.department_id;

Questa query unisce la tabella employees con la tabella departments utilizzando la colonna department_id. Se department_id in employees o departments contiene NULL, quei record non saranno inclusi nel risultato.

Esempio concreto

Ad esempio, consideriamo i seguenti dati:

Tabella employees

employee_idnamedepartment_id
1Alice10
2BobNULL
3Charlie20

Tabella departments

department_iddepartment_name
10HR
20IT
NULLUnknown

Eseguendo una INNER JOIN sui dati precedenti, i record contenenti NULL non soddisfano la condizione di JOIN, quindi il risultato sarà il seguente:

SELECT *
FROM employees
INNER JOIN departments ON employees.department_id = departments.department_id;

Set di risultati

employee_idnamedepartment_iddepartment_name
1Alice10HR
3Charlie20IT

Il record di Bob non sarà incluso nel risultato poiché contiene un valore NULL.

Gestione dei valori NULL nelle LEFT JOIN

La LEFT JOIN include tutti i record della tabella di sinistra nel set di risultati, e utilizza NULL per completare i valori della tabella di destra se la condizione di JOIN non è soddisfatta. Di conseguenza, i record contenenti valori NULL possono essere inclusi nel risultato.

Funzionamento di base della LEFT JOIN

La LEFT JOIN mantiene tutti i record della tabella di sinistra e unisce i record corrispondenti della tabella di destra. Se la condizione di JOIN non è soddisfatta, i valori della tabella di destra saranno completati con NULL. Ecco un esempio:

SELECT *
FROM employees
LEFT JOIN departments ON employees.department_id = departments.department_id;

Questa query include tutti i record della tabella employees nel set di risultati, e i valori della tabella departments sono completati con NULL se la condizione di JOIN non è soddisfatta.

Esempio concreto

Utilizziamo gli stessi dati dell’esempio precedente:

Tabella employees

employee_idnamedepartment_id
1Alice10
2BobNULL
3Charlie20

Tabella departments

department_iddepartment_name
10HR
20IT
NULLUnknown

Quando si esegue una LEFT JOIN, il risultato sarà il seguente:

SELECT *
FROM employees
LEFT JOIN departments ON employees.department_id = departments.department_id;

Set di risultati

employee_idnamedepartment_iddepartment_name
1Alice10HR
2BobNULLNULL
3Charlie20IT

Il record di Bob è incluso nel risultato poiché viene utilizzata una LEFT JOIN, ma poiché non ci sono valori corrispondenti nella tabella departments, department_name è NULL.

Gestione dei valori NULL nelle RIGHT JOIN

La RIGHT JOIN include tutti i record della tabella di destra nel set di risultati, e utilizza NULL per completare i valori della tabella di sinistra se la condizione di JOIN non è soddisfatta. Di conseguenza, i record della tabella di destra vengono prioritizzati.

Funzionamento di base della RIGHT JOIN

La RIGHT JOIN mantiene tutti i record della tabella di destra e unisce i record corrispondenti della tabella di sinistra. Se la condizione di JOIN non è soddisfatta, i valori della tabella di sinistra saranno completati con NULL. Ecco un esempio:

SELECT *
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.department_id;

Questa query include tutti i record della tabella departments nel set di risultati, e i valori della tabella employees sono completati con NULL se la condizione di JOIN non è soddisfatta.

Esempio concreto

Usiamo ancora gli stessi dati:

Tabella employees

employee_idnamedepartment_id
1Alice10
2BobNULL
3Charlie20

Tabella departments

department_iddepartment_name
10HR
20IT
NULLUnknown

Quando si esegue una RIGHT JOIN, il risultato sarà il seguente:

SELECT *
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.department_id;

Set di risultati

employee_idnamedepartment_iddepartment_name
1Alice10HR
3Charlie20IT
NULLNULLNULLUnknown

Tutti i record della tabella departments sono inclusi nel risultato e, se non ci sono valori corrispondenti nella tabella employees, vengono completati con NULL.

Gestione dei valori NULL nelle FULL OUTER JOIN

La FULL OUTER JOIN include tutti i record di entrambe le tabelle nel set di risultati e utilizza NULL per completare i valori delle tabelle di sinistra o di destra se la condizione di JOIN non è soddisfatta. Di conseguenza, tutti i record di entrambe le tabelle vengono completamente combinati.

Funzionamento di base della FULL OUTER JOIN

La FULL OUTER JOIN mantiene tutti i record delle tabelle di sinistra e di destra, e se la condizione di JOIN non è soddisfatta, i valori vengono completati con NULL. Ecco un esempio:

SELECT *
FROM employees
FULL OUTER JOIN departments ON employees.department_id = departments.department_id;

Questa query include tutti i record delle tabelle employees e departments nel set di risultati, e se la condizione di JOIN non è soddisfatta, i valori vengono completati con NULL.

Esempio concreto

Verifichiamo il risultato utilizzando gli stessi dati:

Tabella employees

employee_idnamedepartment_id
1Alice10
2BobNULL
3Charlie20

Tabella departments

department_iddepartment_name
10HR
20IT
NULLUnknown

Quando si esegue una FULL OUTER JOIN, il risultato sarà il seguente:

SELECT *
FROM employees
FULL OUTER JOIN departments ON employees.department_id = departments.department_id;

Set di risultati

employee_idnamedepartment_iddepartment_name
1Alice10HR
3Charlie20IT
2BobNULLNULL
NULLNULLNULLUnknown

Tutti i record di entrambe le tabelle sono inclusi nel risultato e, se la condizione di JOIN non è soddisfatta, i valori vengono completati con NULL.

Gestione dei valori NULL nelle operazioni di JOIN

Per gestire correttamente i record contenenti valori NULL durante le operazioni di JOIN, è necessario ottimizzare la query SQL. Qui vengono presentate alcune tecniche per eseguire JOIN tenendo conto dei valori NULL.

Uso della funzione COALESCE

Utilizzando la funzione COALESCE, è possibile sostituire i valori NULL con altri valori. In questo modo, si evita che i valori NULL influenzino la valutazione della condizione di JOIN. Ad esempio, è possibile sostituire i valori NULL con 0 nel modo seguente:

SELECT *
FROM employees
JOIN departments ON COALESCE(employees.department_id, 0) = COALESCE(departments.department_id, 0);

In questa query, i valori NULL vengono sostituiti con 0, consentendo di unire correttamente anche i record contenenti NULL.

Uso di IS NULL e IS NOT NULL

Per filtrare i record contenenti valori NULL, è possibile utilizzare IS NULL e IS NOT NULL. Ad esempio, per unire solo i record che non contengono valori NULL, si può fare quanto segue:

SELECT *
FROM employees
JOIN departments ON employees.department_id = departments.department_id
WHERE employees.department_id IS NOT NULL AND departments.department_id IS NOT NULL;

Questa query unisce solo i record in cui department_id non è NULL in entrambe le tabelle.

Uso appropriato di LEFT JOIN e RIGHT JOIN

Quando si desidera includere nel risultato i record che non soddisfano la condizione di JOIN, è possibile utilizzare LEFT JOIN o RIGHT JOIN. In questo modo, si possono includere anche i record che non esistono in una delle tabelle.

SELECT *
FROM employees
LEFT JOIN departments ON employees.department_id = departments.department_id;

In questa query, tutti i record della tabella employees sono inclusi nel set di risultati, e i valori corrispondenti della tabella departments sono completati con NULL se non esistono.

Gestione dei valori NULL utilizzando la funzione COALESCE

La funzione COALESCE viene utilizzata per sostituire i valori NULL con un valore specificato. In questo modo, è possibile controllare l’impatto dei record contenenti valori NULL nelle operazioni di JOIN e altre operazioni SQL.

Sintassi di base della funzione COALESCE

La funzione COALESCE accetta più argomenti e restituisce il primo valore non NULL. La sintassi è la seguente:

COALESCE(value1, value2, ..., valueN)

Questa funzione restituisce il primo valore non NULL tra value1 e valueN. Se tutti gli argomenti sono NULL, restituisce NULL.

Esempio concreto: Sostituzione dei valori NULL

Ad esempio, per sostituire i valori NULL nella colonna department_id della tabella employees con 0, si può fare quanto segue:

SELECT employee_id, name, COALESCE(department_id, 0) AS department_id
FROM employees;

Questa query sostituisce i valori NULL nella colonna department_id con 0 e restituisce il risultato.

Uso della funzione COALESCE nelle operazioni di JOIN

Ecco un esempio di utilizzo della funzione COALESCE per gestire i valori NULL nelle operazioni di JOIN. Ad esempio, per unire la tabella employees con la tabella departments utilizzando department_id, sostituendo i valori NULL con 0, si può fare quanto segue:

SELECT *
FROM employees
JOIN departments ON COALESCE(employees.department_id, 0) = COALESCE(departments.department_id, 0);

In questa query, i valori NULL nella colonna department_id vengono sostituiti con 0, consentendo di unire correttamente anche i record contenenti NULL.

Uso della funzione COALESCE su più colonne

La funzione COALESCE può essere utilizzata su più colonne. Ad esempio, per ottenere il primo valore non NULL tra più campi di indirizzo, si può fare quanto segue:

SELECT employee_id, name, COALESCE(address1, address2, address3) AS address
FROM employees;

Questa query restituisce il primo valore non NULL tra address1, address2 e address3 e lo assegna alla colonna address.

Filtraggio dei valori NULL utilizzando IS NULL/IS NOT NULL

Nei comandi SQL, l’uso di IS NULL e IS NOT NULL è utile per identificare o escludere i record contenenti valori NULL. Utilizzando queste condizioni, è possibile filtrare efficacemente i valori NULL.

Filtraggio utilizzando IS NULL

IS NULL seleziona i record in cui la colonna specificata contiene valori NULL. Ad esempio, per selezionare i record della tabella employees in cui department_id è NULL, si può fare quanto segue:

SELECT *
FROM employees
WHERE department_id IS NULL;

Questa query restituisce tutti i record in cui department_id è NULL.

Filtraggio utilizzando IS NOT NULL

IS NOT NULL seleziona i record in cui la colonna specificata non contiene valori NULL. Ad esempio, per selezionare i record della tabella employees in cui department_id non è NULL, si può fare quanto segue:

SELECT *
FROM employees
WHERE department_id IS NOT NULL;

Questa query restituisce tutti i record in cui department_id non è NULL.

Uso di IS NULL/IS NOT NULL nelle operazioni di JOIN

Durante le operazioni di JOIN, IS NULL e IS NOT NULL possono essere utilizzati per gestire correttamente i record contenenti valori NULL. Ad esempio, per unire le tabelle employees e departments includendo solo i record in cui department_id non è NULL, si può fare quanto segue:

SELECT *
FROM employees
JOIN departments ON employees.department_id = departments.department_id
WHERE employees.department_id IS NOT NULL AND departments.department_id IS NOT NULL;

Questa query unisce solo i record in cui department_id non è NULL in entrambe le tabelle.

Gestione specifica dei valori NULL

Per gestire i valori NULL in base a condizioni specifiche, è utile utilizzare la clausola CASE. Ad esempio, per trattare in modo specifico i record contenenti valori NULL, si può fare quanto segue:

SELECT employee_id, name, 
       CASE 
           WHEN department_id IS NULL THEN 'No Department' 
           ELSE department_id 
       END AS department
FROM employees;

Questa query visualizza “No Department” se department_id è NULL, altrimenti mostra il valore effettivo di department_id.

Conclusione

Durante le operazioni di JOIN in SQL, i record contenenti valori NULL vengono trattati in modo speciale, il che può influire sui risultati in modo inatteso. In questo articolo, abbiamo esplorato il comportamento dei valori NULL nei vari tipi di JOIN (INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN) e come gestirli.

Abbiamo illustrato tecniche come l’uso della funzione COALESCE per sostituire i valori NULL con altri valori, e l’uso di IS NULL e IS NOT NULL per filtrare i valori NULL. Applicando queste tecniche, è possibile controllare con maggiore precisione i risultati delle query SQL e migliorare l’affidabilità delle operazioni sui dati.

Comprendere e gestire correttamente i valori NULL nelle operazioni di JOIN consente di eseguire operazioni su database in modo più robusto e coerente. Ciò migliora l’affidabilità dell’analisi dei dati e delle applicazioni, consentendo di estrarre informazioni di maggior valore.

Concludiamo qui la nostra spiegazione sul comportamento e la gestione dei record contenenti valori NULL durante le operazioni di JOIN in SQL.

Indice