Torna all'elenco degli articoli Articoli
Tempo di lettura: 8 minuti

10 esercizi su NULL per principianti

Volete esercitarvi a gestire i valori NULL nelle vostre query? Date un'occhiata a questi 10 nuovi esercizi di pratica sui NULL!

La padronanza di SQL richiede molta pratica. Sebbene l'apprendimento della teoria sia importante, la pratica è uno dei modi migliori per mantenere aggiornate le proprie competenze in SQL. In questo articolo vi presentiamo 10 esercizi sui NULL da analizzare, completi di soluzioni e spiegazioni.

La gestione dei NULL può cogliere di sorpresa i principianti di SQL. I NULL non si comportano come i dati normali, ma rappresentano la totale assenza di informazioni, il che può renderli difficili da capire all'inizio.

I seguenti esercizi SQL vi aiuteranno ad affinare le vostre competenze sull'argomento NULL. Verranno affrontate tutte le complessità del lavoro con i NULL e si farà pratica su un'ampia gamma di casi d'uso che coinvolgono i dati mancanti.

E se volete fare ancora più pratica, non solo con i NULL, ma con l'intero SQL, provate la nostra traccia Pratica su SQL . Contiene oltre 1250 esercizi pratici per aiutarvi a padroneggiare SQL. E poiché tutto avviene nel vostro browser, non c'è nulla da configurare o scaricare.

Siete pronti per esercitazioni pratiche su SQL NULL? Immergiamoci subito!

Conoscere i dati

Per questo esercizio utilizzeremo due tabelle: employee e department. Osservate alcuni dati di esempio di ciascuna tabella:

employee

idnamesalarybonuspositiondepartment_idmanager_id
1John Doe55001250CEO1NULL
2Jane Doe47501100CTO1NULL
3Mike Johnson2900NULLHead Accountant2NULL
4Sarah Brown23500Accountant23
5James Clark2500NULLHead of Marketing3NULL
6Emily Davis3100NULLSoftware Developer42

Nella tabella dei dipendenti, alcune colonne possono avere valori mancanti (NULL). Ad esempio, manager_id è NULL per tutti i dipendenti che non hanno un altro dipendente che li supervisiona (cioè il manager stesso). Inoltre, le informazioni salary e bonus possono essere mancanti nel caso in cui non siano applicabili a quel dipendente specifico.

department

idnameregion
1Executive TeamCentral Hub
2AccountingNorthwest
3SalesWest Coast
4DevelopmentNULL

Nella department tabella, solo la regione può essere NULL. Questo indica che il dipartimento opera online. Torneremo su questo punto negli esercizi.

Esercizi SQL NULL

1. Capi squadra

Esercizio: Visualizzare le informazioni su tutti i team lead (cioè i dipendenti che non hanno un manager_id).

Soluzione:

SELECT *
FROM employee
WHERE manager_id IS NULL;

Spiegazione: Per filtrare i dipendenti che non hanno un manager_id, è necessario utilizzare l'operatore IS NULL. L'uso di operatori regolari come = o != con NULL non funziona come previsto in SQL. Se li si usa, il risultato sarà sempre NULL e la condizione WHERE fallirà.

Se si volesse mostrare tutti i dipendenti non capo-squadra, la condizione di filtraggio sarebbe WHERE manager_id IS NOT NULL. Per ulteriori informazioni su cosa sono e come funzionano i NULL, consultare NULL e Gestione dei dati mancanti in SQL.

2. Reparti stabiliti

Esercizio: Visualizzare tutti i reparti fisici (cioè quelli che hanno un valore di regione). I reparti senza regione operano in linea.

Soluzione:

SELECT *
FROM department
WHERE region IS NOT NULL;

Spiegazione: Utilizzare lo stesso principio di filtraggio discusso nell'esercizio precedente. In questo caso, è necessario utilizzare l'operatore IS NOT NULL.

3. Bonus mancanti

Esercizio: Visualizzare il numero di dipendenti che hanno un bonus mancante.

Soluzione:

SELECT COUNT(*)
FROM employee
WHERE bonus IS NULL;

Spiegazione: Filtrare i dipendenti senza bonus utilizzando l'operatore IS NULL. Utilizzare la funzione aggregata COUNT() per contare il numero di dipendenti senza bonus.

Nota: Assicurarsi di utilizzare l'argomento corretto per la funzione COUNT(), poiché COUNT(bonus) WHERE bonus IS NULL restituirà sempre 0.

4. Piccoli bonus

Esercizio: Visualizzare tutti i dipendenti che hanno ricevuto un bonus inferiore a 300, compresi quelli che non hanno un bonus registrato. Mostrare prima i dipendenti senza bonus registrati, quindi ordinare i dipendenti dal bonus più piccolo a quello più grande.

Soluzione:

SELECT *
FROM employee
WHERE bonus < 300
  OR bonus IS NULL
ORDER BY bonus NULLS FIRST;

Spiegazione: In questo caso, la condizione è divisa in due parti:

  1. Bonus inferiori a 300 e
  2. Bonus mancanti.

Possiamo usare l'operatore < (meno di) nella prima parte, ma la seconda parte avrà bisogno dell'operatore IS NULL.

Ricordate che NULL non è "più grande" o "più piccolo" di 300, quindi è necessario utilizzare specificamente IS NULL. Unite le due condizioni con l'operatore OR.

Per ordinare le righe in base al bonus, utilizzare la clausola ORDER BY. Per impostazione predefinita, le righe saranno ordinate in ordine crescente (cioè dal bonus più piccolo a quello più grande). Per specificare esplicitamente che le righe NULL devono essere le prime nel risultato, utilizzare la clausola NULLS FIRST.

5. Dipendenti online

Esercizio: Trovare tutti i dipendenti che lavorano in reparti remoti (cioè quelli in cui la regione è NULL). Visualizzare il nome del dipendente e il nome del reparto.

Soluzione:

SELECT 
  employee.name AS employee,
  department.name AS department
FROM employee
JOIN department
  ON employee.department_id = department.id
WHERE department.region IS NULL;

Spiegazione: Unire gli elementi employee e department per avere accesso sia al nome del dipendente che a quello del reparto name. Rinominare le colonne con la parola chiave AS per evitare nomi duplicati. Filtrare quindi il risultato in base a region reparto, mantenendo solo le righe in cui è presente la regione IS NULL.

6. Dipendenti e regioni

Esercizio: Per ogni dipendente, visualizzare il nome, il nome del reparto assegnato e la regione in cui si trova il reparto. Per i dipendenti dei reparti in cui manca una regione, indicare ‘Online’ come regione.

Soluzione:

SELECT 
  employee.name AS employee,
  department.name AS department,
  COALESCE(region, ‘Online’) AS region
FROM employee
JOIN department
  ON employee.department_id = department.id;

Spiegazione: Per visualizzare sia il nome del dipendente che il nome e la regione del reparto, unire le tabelle.

I dipendenti dei reparti senza regione avranno NULL come valore della colonna. Per sostituirla, si può usare la funzione COALESCE(): essa manterrà i valori non nulli, ma sostituirà i valori NULLnel risultato con un nuovo valore da noi fornito (‘Online’). Per saperne di più sul funzionamento di questa funzione, consultate il nostro articolo sulla funzione COALESCE().

7. Organico regionale

Esercizio: Visualizzare ogni regione del database insieme al numero di dipendenti che lavorano in quella regione. Mostrare ‘Online’ come regione per i dipendenti che non ne hanno una.

Soluzione:

SELECT 
  COALESCE(region, ‘Online’) AS region,
  COUNT(*)
FROM employee
JOIN department
  ON employee.department_id = department.id
GROUP BY region;

Spiegazione: Unire gli elementi employee e department e le tabelle. Come nell'ultimo esercizio, utilizzare la funzione COALESCE() per sostituire le regioni mancanti con "Online".

Aggiungere la funzione aggregata COUNT() per ottenere il numero di dipendenti in ogni regione, quindi raggruppare il risultato in base alla colonna regione.

Nota: Non è necessario utilizzare COALESCE() nella clausola GROUP BY. COALESCE() sostituisce tutte le NULLcon lo stesso valore, quindi il numero di gruppi e le righe in essi contenute rimangono invariati.

8. Rapporto tra bonus e stipendio

Esercizio: Per ogni dipendente, visualizzare il suo nome e il rapporto tra il suo bonus e il suo stipendio. Se il bonus è 0, visualizzare NULL.

Soluzione:

SELECT 
  name,
  NULLIF(bonus, 0) / salary AS ratio 
FROM employee;

Spiegazione: Quando si calcola il rapporto tra lo stipendio e il bonus, bisogna tenere presente che il bonus potrebbe essere 0 e non si vuole visualizzare 0 nel risultato finale. Per evitare ciò, si può utilizzare la funzione NULLIF() con la colonna bonus. Questa funzione controlla se il bonus è 0; se lo è, sostituisce lo 0 con NULL. Qualsiasi operazione aritmetica che includa NULL avrà come risultato la restituzione di NULL. Pertanto, se il bonus è NULL, anche il rapporto sarà NULL.

9. Organico dei reparti

Esercizio: Per ogni reparto, contare il numero di dipendenti che vi lavorano. Includere tutti i reparti, anche quelli che non hanno dipendenti assegnati. Ignorare i dipendenti senza reparto.

Soluzione:

SELECT 
  department.name AS department,
  COUNT(employee.id) AS employees
FROM department
LEFT JOIN employee
  ON department.id = employee.department_id
GROUP BY 
  department.name, 
  department.id;

Spiegazione: Unire i dati department e employee e. Per assicurarsi che i reparti senza dipendenti vengano visualizzati nel risultato, utilizzare LEFT JOIN e posizionare la tabella department per prima. Contare gli ID dei dipendenti per evitare di contare le righe NULL e raggruppare il risultato in base al nome del reparto e a id (nel caso in cui due reparti abbiano lo stesso nome).

10. Ruoli per reparto

Esercizio: Visualizzare il nome di ogni reparto, la regione e il numero di ruoli diversi al suo interno. Assicurarsi che ci sia una sezione "non assegnata" per i dipendenti senza un reparto assegnato.

Soluzione:

SELECT
  COALESCE(department.name, ‘unassigned’) AS department,
  region,
  COUNT(DISTINCT position) AS different_positions
FROM department
FULL OUTER JOIN employee
  ON employee.department_id = department.id
GROUP BY
  department.region, 
  department.name, 
  department.id

Spiegazione: Unire le sezioni department e employee utilizzando un FULL OUTER JOIN per assicurarsi che vengano mostrati i reparti senza dipendenti e i dipendenti senza reparti. L'ordine delle tabelle non ha importanza.

Per gestire i dipendenti senza reparto, utilizzare la funzione COALESCE() per sostituire il nome del reparto con ‘unassigned’. Contate il numero di posizioni diverse in ogni reparto usando COUNT(DISTINCT position). Per ulteriori informazioni sull'uso della parola chiave DISTINCT, consultare l'articolo del ricettario.

Raggruppare i risultati in base alla regione, al nome e all'id del reparto. Si noti che "non assegnato" è uno dei gruppi risultanti.

Avete voglia di altri esercizi pratici su SQL NULL?

Ben fatto! Avete imparato un po' di cose sulla gestione dei NULL in SQL! Se volete altri esercizi pratici, date un'occhiata alla nostra ampia traccia Pratica su SQL . Oltre ai NULL, copre tutti gli argomenti per aiutarvi a mantenere le vostre abilità in SQL.

Buona pratica!