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

Qual è il ruolo di DISTINCT in SQL?

La parola chiave DISTINCT in SQL svolge un ruolo importante nella rimozione dei valori duplicati dai risultati. Questo articolo fornisce esempi che mostrano esattamente il funzionamento di DISTINCT.

Per impostazione predefinita, le query SQL mostrano tutte le righe restituite, comprese quelle duplicate, nel set di risultati. La parola chiave DISTINCT nella clausola SELECT viene utilizzata per eliminare le righe duplicate e visualizzare un elenco unico di valori. In altre parole, la parola chiave DISTINCT recupera valori unici da una tabella.

La sintassi di base della parola chiave DISTINCT in SQL è la seguente:

SELECT DISTINCT
  column_1,
  column_2,
  …,
  column_n
FROM table_name

(Se la sintassi di cui sopra vi confonde, prendete in considerazione il corso LearnSQL.it' SQL Basics . Copre i fondamenti di SQL, compresa la parola chiave DISTINCT ).

Si noti che la parola chiave DISTINCT deve essere anteposta alle colonne specificate. È possibile specificare più di una colonna da DISTINCT, in modo che SQL restituisca solo combinazioni uniche dei valori di tali colonne. Se si seleziona più di una colonna, tutte le colonne vengono combinate e viene considerata solo l'unicità della riga. SQL DISTINCT cerca una riga distinta, piuttosto che una colonna distinta.

Vediamo la parola chiave DISTINCT in azione con un esempio pratico. Prima, però, dobbiamo familiarizzare con i dati con cui lavoreremo. Immaginiamo di avere una tabella chiamata employee_infoche contiene i dati dei dipendenti della nostra azienda:

employee_idfirst_namelast_namedepartmentage
127374JoshuaReesSales26
293421KarenBowerSales45
244813LukePayneNULL42
463281MaxPaigeHuman Resources53
374241JuliaGloverHuman Resources29
568421RoseHarrisHuman Resources43
NULLNULLNULLNULLNULL
839211OliviaBakerSales32
293493KarenBowerSales45
463281MaxPaigeHuman Resources53
244813LukePayneNULL42
933821BernadetteParsonsSalesNULL

SQL DISTINCT su una singola colonna

Vediamo l'effetto della parola chiave DISTINCT quando cerchiamo di SELECT la colonna employee_id. Per prima cosa, ecco la query prima dell'applicazione della parola chiave DISTINCT:

SELECT employee_id
FROM employee_info

Il risultato è il seguente:

employee_id
127374
293421
244813
463281
374241
568421
NULL
839211
293493
463281
244813
933821

L'esecuzione di questa query restituisce l'intera colonna employee_id della nostra tabella. Questa colonna corrisponde alla tabella employee_info corrisponde esattamente alla tabella. Ad un'analisi più attenta, si notano alcuni valori duplicati: 244813 e 463281 compaiono due volte.

Aggiungiamo la parola chiave DISTINCT per risolvere questi valori duplicati. Ricordare che la parola chiave DISTINCT viene aggiunta prima di specificare le colonne:

SELECT DISTINCT employee_id 
FROM employee_info
employee_id
127374
293421
244813
463281
374241
568421
NULL
839211
293493
933821

L'insieme di dati risultante appare più corto; da questa risposta si possono trarre diversi insegnamenti.

SQL DISTINCT rimuove i valori duplicati

Se confrontiamo la tabella originale con il nostro risultato, possiamo vedere che i duplicati sono stati filtrati con successo. L'uso della parola chiave DISTINCT è solo uno dei metodi per rimuovere i valori duplicati, come mostrato in questo articolo sui diversi modi per rimuovere i duplicati in SQL.

La tabella employee_info tabella contiene due occorrenze dei seguenti valori:

employee_id
244813
463281

Tuttavia, il nostro risultato ora mostra questi valori solo una volta. La parola chiave DISTINCT ha sortito l'effetto desiderato.

Attenzione alle colonne utilizzate

Quando si visualizza per la prima volta la employee_info sembra che queste righe siano duplicate.

employee_idfirst_namelast_namedepartmentage
293421KarenBowerSales45
293493KarenBowerSales45

A un'analisi più attenta, si può notare che il valore di employee_id è diverso. Poiché abbiamo applicato la parola chiave DISTINCT a questa colonna employee_id, entrambi i valori vengono restituiti.

L'inclusione dei valori NULL

Probabilmente avrete notato la presenza di valori NULL nel set di dati restituito. In SQL, NULL è considerato un valore univoco, il che significa che verrà restituito quando si utilizza la parola chiave DISTINCT. Se si desidera rimuovere i valori NULL dal risultato, si può scrivere la seguente query:

SELECT DISTINCT
  * 
FROM employee_info 
WHERE employee_id IS NOT NULL

SQL DISTINCT con una sottoquery

È possibile utilizzare la parola chiave DISTINCT anche come parte di una sottoquery. Tuttavia, è bene ricordare che una sottoquery IN, ANY o EXISTS ha valore vero se esiste almeno una riga che fa sì che la sottoquery abbia valore vero. Questo rende inutile l'uso di una DISTINCT con una subquery IN, ANY o EXISTS.

SQL DISTINCT con più colonne

Le colonne specificate come DISTINCT giocano un ruolo fondamentale nella restituzione dei dati. Osservate la seguente query:

SELECT DISTINCT
  employee_id,
  first_name,
  last_name 
FROM employee_info

Stiamo cercando combinazioni uniche di queste tre colonne. L'esecuzione della query produce il seguente risultato:

employee_idfirst_namelast_name
127374JoshuaRees
293421KarenBower
244813LukePayne
463281MaxPaige
374241JuliaGlover
568421RoseHarris
NULLNULLNULL
839211OliviaBaker
293493KarenBower
933821BernadetteParsons

Quando si esamina questo insieme di risultati, ci si aspetta di vedere nomi completamente unici insieme a employee_id. Ad esempio, osservate questi dati:

employee_idfirst_namelast_name
293421KarenBower
293493KarenBower

Il valore employee_id è unico per entrambe le righe, quindi anche queste righe sono considerate uniche. Se si modifica la query nel modo seguente:

SELECT DISTINCT
  first_name,
  last_name 
FROM employee_info

... employee_id non viene più considerato; ora stiamo cercando combinazioni uniche di nomi. Pertanto, viene visualizzata una sola riga per "Karen Bower":

first_namelast_name
JoshuaRees
KarenBower
LukePayne
MaxPaige
JuliaGlover
RoseHarris
NULLNULL
OliviaBaker
BernadetteParsons

Se non riuscite a ottenere i risultati desiderati utilizzando la parola chiave DISTINCT, prestate particolare attenzione alle colonne che avete incluso. Se questo esempio specifico vi crea ancora confusione, date un'occhiata a questo articolo su come contare i valori distinti in SQL.

SQL DISTINCT con le funzioni aggregate

La parola chiave DISTINCT può essere utilizzata insieme alle funzioni aggregate. Le funzioni aggregate più comuni sono:

  • MIN() - Restituisce il valore più piccolo (minimo).
  • MAX() - Restituisce il valore più grande (massimo).
  • SUM() - Restituisce la somma dei valori specificati.
  • AVG() - Restituisce la media dei valori specificati (ad esempio, in una colonna).
  • COUNT() - Restituisce il numero di elementi (ad esempio in una colonna).

Quando DISTINCT viene utilizzato con SUM(), AVG() e COUNT(), elimina i valori duplicati prima di calcolare la somma, la media o il conteggio. È possibile utilizzare la parola chiave DISTINCT con MIN() e MAX(), ma è inutile farlo; non avrà alcun impatto sui risultati.

Applichiamo queste informazioni all'esempio precedente relativo alla tabella employee_info tabella. Se volessimo contare il numero di dipendenti attualmente in servizio presso la nostra azienda, avendo cura di eliminare le voci duplicate, scriveremmo la seguente query:

SELECT COUNT(DISTINCT employee_id)
FROM employee_info

Il risultato di questa query è:

COUNT(DISTINCT employee_id)
9

Questo è l'esempio più semplice di come la parola chiave DISTINCT possa essere usata insieme alle funzioni aggregate. L'esecuzione di questa query senza la parola chiave DISTINCT includerebbe i valori duplicati nel conteggio:

SELECT COUNT(employee_id) 
FROM employee_info

Il risultato di questa query è:

COUNT(employee_id)
11

Se si pensa che la propria tabella possa contenere record duplicati, l'uso di DISTINCT è un modo eccellente per garantire che la reportistica sia accurata e non sia influenzata da valori duplicati. Se questo caso d'uso non vi è chiaro, vi consiglio di leggere questo articolo sul conteggio dei valori distinti in SQL. Esistono molti altri casi d'uso di COUNT(); per ulteriori esempi utili, consultate questo articolo che spiega le differenze tra le applicazioni più comuni della funzione COUNT().

DISTINCT con funzioni aggregate e GROUP BY

Utilizziamo una funzione aggregata con la parola chiave DISTINCT per risolvere un problema comune. Vogliamo trovare il numero di potenziali voci duplicate di employee_id per ogni coppia di nomi nella nostra tabella. Vogliamo isolare il caso in cui il nome del dipendente è esattamente lo stesso, ma con un employee_id diverso. Ecco la query:

SELECT
  first_name,
  last_name,
  COUNT(DISTINCT employee_id) 
FROM employee_info 
GROUP BY first_name, last_name

E il risultato:

employee_idfirst_nameCOUNT (DISTINCT employee_id)
NULLNULL0
BernadetteParsons1
JoshuaRees1
JuliaGlover1
KarenBower2
LukePayne1
MaxPaige1
OliviaBaker1
RoseHarris1

Possiamo vedere da questi risultati che abbiamo due voci diverse per employee_id di Karen Bower. Questa è un'ottima informazione da avere. Se non ci sono due persone diverse di nome Karen Bower che lavorano nella nostra azienda, sappiamo che questa informazione è stata inserita per errore e può essere considerata un duplicato da rimuovere.

L'apprendimento di DISTINCT in SQL è solo l'inizio!

La capacità di isolare ed escludere i dati duplicati dai risultati delle query è un'abilità importante per tutti gli utenti di SQL. La parola chiave DISTINCT svolge un ruolo importante nella capacità di farlo in modo efficace. Se vi è piaciuto questo articolo e volete continuare a imparare l'SQL, prendete in considerazione il nostro percorso di apprendimento SQL Fundamentals . Vi insegnerà le istruzioni SQL di base come WHERE, GROUP BY, ORDER BY e HAVING. Imparerete anche come JOIN tabelle e come aggiungere, modificare o rimuovere dati da un database.