A volte i database sembrano una persona con la memoria corta: scrive tutto, ma si dimentica di averlo già scritto. Così apri la tabella con le città dei clienti e trovi dieci "Berlino", cinque "Seattle" e un sacco di altri doppioni. Succede quando la stessa città appare per clienti diversi. Ma non vuoi mica fare una campagna pubblicitaria per dieci "Berlino", quando in realtà è solo una città, giusto?
Per tirare fuori solo i valori unici — senza duplicati — c'è il comando DISTINCT. È tipo una scopa magica: con un colpo solo toglie le righe ripetute e lascia solo quello che davvero è diverso.
DISTINCT ti permette di estrarre solo le righe uniche dal risultato della query. È utile quando vuoi liberarti dei dati ripetuti, tipo:
- Prodotti unici negli ordini.
- Nomi unici dei clienti.
- Combinazioni uniche di dati, tipo "città + paese".
Come funziona DISTINCT?
La sintassi di DISTINCT è semplice e chiara, come spesso succede con SQL:
SELECT DISTINCT colonna1, colonna2, ...
FROM tabella;
Quando aggiungi DISTINCT alla query, il database garantisce che ogni riga nel risultato sia unica.
Esempi di utilizzo di DISTINCT
Partiamo dagli esempi classici, così capiamo come funziona DISTINCT.
Esempio 1: Valori unici di una colonna
Supponiamo di avere una tabella students con i dati degli studenti:
-- Tabella students
| id | first_name | last_name | city |
|---|---|---|---|
| 1 | Maria | Chi | Seattle |
| 2 | Alex | Lin | Toronto |
| 3 | Anna | Song | Seattle |
| 4 | Nat | Cole | Chicago |
| 5 | Maria | Chi | Seattle |
Vogliamo sapere da quali città arrivano gli studenti. Scriviamo la query
SELECT city
FROM students;
e otteniamo il risultato:
| city |
|---|
| Seattle |
| Toronto |
| Seattle |
| Chicago |
| Seattle |
Non è proprio quello che volevamo :(
Per togliere i duplicati bisogna usare DISTINCT:
SELECT DISTINCT city
FROM students;
Risultato:
| city |
|---|
| Seattle |
| Toronto |
| Chicago |
Senza DISTINCT nel risultato vediamo "Seattle" tre volte, ma a noi serviva solo una volta.
Esempio 2: Valori unici di più colonne
Ora immaginiamo di voler ottenere le combinazioni uniche "nome + cognome", perché tra gli studenti potrebbero esserci omonimi o persone con lo stesso cognome.
Abbiamo sempre la stessa tabella students:
-- Tabella students
| id | first_name | last_name | city |
|---|---|---|---|
| 1 | Maria | Chi | Seattle |
| 2 | Alex | Lin | Toronto |
| 3 | Anna | Song | Seattle |
| 4 | Nat | Cole | Chicago |
| 5 | Maria | Chi | Seattle |
Query:
SELECT DISTINCT first_name, last_name
FROM students;
Risultato:
| first_name | last_name |
|---|---|
| Maria | Chi |
| Alex | Lin |
| Anna | Song |
| Nat | Cole |
Quindi, DISTINCT funziona come un filtro: considera tutte le colonne indicate e elimina i doppioni solo delle righe dove i valori di tutte queste colonne coincidono.
Esempio 3: Combinazioni uniche e ordinamento
Ora combiniamo DISTINCT con l'ordinamento ORDER BY, così otteniamo i valori unici ordinati in ordine alfabetico per cognome.
Abbiamo la tabella students:
-- Tabella students
| id | first_name | last_name | city |
|---|---|---|---|
| 1 | Maria | Chi | Seattle |
| 2 | Alex | Lin | Toronto |
| 3 | Anna | Song | Seattle |
| 4 | Nat | Cole | Chicago |
| 5 | Maria | Chi | Seattle |
Query:
SELECT DISTINCT first_name, last_name
FROM students
ORDER BY last_name ASC;
Risultato:
| first_name | last_name |
|---|---|
| Maria | Chi |
| Nat | Cole |
| Alex | Lin |
| Anna | Song |
Le righe duplicate sono state tolte e i cognomi sono ordinati in ordine alfabetico.
Esempio 4: Uso con le funzioni di aggregazione
E se proviamo a usare DISTINCT con una funzione, tipo COUNT?
SELECT COUNT(DISTINCT city) AS unique_city_count
FROM students;
Risultato:
| unique_city_count |
|---|
| 3 |
Questa query ti restituisce il numero di città uniche. Comodo, vero?
Caratteristiche di DISTINCT
Quando usi DISTINCT è importante capire che funziona su tutte le colonne indicate. Se aggiungi più colonne alla query, il risultato può cambiare.
Esempio 5: Perché è importante capire il contesto?
Se aggiungi altri campi alla query, questo può influire sull'unicità delle righe.
SELECT DISTINCT first_name, city
FROM students;
Tabella students:
| id | first_name | last_name | city |
|---|---|---|---|
| 1 | Maria | Chi | Seattle |
| 2 | Alex | Lin | Austin |
| 3 | Anna | Song | Seattle |
| 4 | Otto | Art | Denver |
| 5 | Maria | Chi | Portland |
Risultato:
| first_name | city |
|---|---|
| Maria | Seattle |
| Alex | Austin |
| Anna | Seattle |
| Otto | Denver |
| Maria | Portland |
Ogni combinazione "nome + città" ora è unica. Quindi ricordati: l'unicità è determinata da tutte le colonne indicate, non da ciascuna colonna separatamente.
Errori tipici con DISTINCT
Uno degli errori più comuni con DISTINCT è non capire bene cosa fa la query. Per esempio, se metti troppe colonne nella query, puoi ottenere un risultato molto diverso da quello che ti aspettavi, perché l'unicità sarà calcolata su tutte le colonne.
Per esempio:
SELECT DISTINCT *
FROM students;
In questo caso ogni riga sarà considerata unica, perché vengono considerate tutte le colonne.
Un altro errore — usare DISTINCT dove non serve. Se sei sicuro che i dati sono già unici (tipo una colonna che è chiave primaria), allora DISTINCT aggiunge solo carico inutile al DBMS.
GO TO FULL VERSION