back to top

SQL: Utilizzare SELECT DISTINCT per eliminare i doppioni

Quando si lavora coi i database è fondamentale saper gestire in modo efficiente i dati memorizzati. Uno dei problemi comuni che gli sviluppatori e gli analisti di database incontrano è la presenza di dati duplicati all’interno delle tabelle.

In questo contesto può rivelarsi utile conoscere la giusta sintassi SQL attraverso la quale isolare valori unici e a creare set di dati più “puliti” e coerenti. Nel seguente articolo, esploreremo come funziona questa sintassi e come può essere implementata per migliorare la gestione dei dati nel tuo database.

Il comando SELECT DISTINCT

Il comando SELECT DISTINCT di SQL è utilizzato per estrarre una sola volta ogni diversa occorrenza di un valore all’interno di un dato campo. Per essere più precisi, il comando principale è SELECT, mentre la clausola DISTINCT funge da suo modificatore, contribuendo a filtrare i risultati e a evitare duplicati.

La sintassi SELECT DISTINCT viene implementata quando c’è la necessità di estrarre da un campo, dove sono ammessi valori ripetuti, un elenco di valori senza i duplicati. Per comprenderne meglio l’utilizzo, procediamo con un esempio pratico che ci aiuterà a comprendere meglio la situazione.

Immaginiamo di lavorare con il database di un negozio online che contiene una tabella “prodotti” strutturata come segue:

  • id – chiave primaria
  • marca
  • modello
  • prezzo

In questo contesto è evidente che il campo “marca” può contenere valori duplicati. Ecco un estratto della tabella in questione:

idmarcamodelloprezzo
1AppleiPad400
2AppleiPad Mini300
3AppleiPhone500
4SamsungGalaxy Tab400
5MicrosoftLumia200
6MicrosoftSurface400

Ora supponiamo di voler estrarre solo le marche disponibili nel nostro negozio. Per farlo dovremo eseguire una query SELECT come questa:

SELECT DISTINCT marca FROM prodotti ORDER BY marca ASC;

Effettuando questa operazione, otterremo il seguente resultset:

Apple
Microsoft
Samsung

Al contrario, omettendo la clausola DISTINCT, la query SELECT avrebbe restituito:

Apple
Apple
Apple
Microsoft
Microsoft
Samsung

Come si può notare, l’utilizzo di SELECT DISTINCT (invece di una semplice SELECT) consente di eliminare i duplicati, creando una lista di valori univoci.

Utilizzare indici per migliorare le performance di SELECT DISTINCT

Quando si lavora con una grande mole di dati l’utilizzo di SELECT DISTINCT può comportare una riduzione delle performance del database che, in alcune circostanze, potrebbe compromettere la fluidità dell’applicativo.

In un ambiente dinamico come un sito di e-commerce, ad esempio, la velocità e l’efficienza nelle query sono vitali per mantenere un’esperienza utente fluida e reattiva. In situazioni come questa, pertanto, potrebbe rivelarsi molto utile aggiungere degli indici appropriati nel database.

Per esempio, nell’ambito della nostra tabella “prodotti”, l’implementazione di un indice sul campo “marca” può accelerare significativamente le query che utilizzano la clausola SELECT DISTINCT, riducendo così il tempo necessario per estrarre tutte le marche uniche disponibili nel nostro store.

Di seguito un esempio di query per aggiungere l’indice alla tabella “prodotti”:

CREATE INDEX indice_marca ON prodotti (marca);

L’aggiunte di un indice può migliorare notevolmente le prestazioni perché, invece di dover scandagliare l’intera tabella, il sistema può semplicemente consultare l’indice per ottenere rapidamente un elenco di valori distinti, rendendo le operazioni di filtraggiomolto più veloci e contribuendo a mantenere prestazioni ottimali anche con un grande volume di dati.

SELECT DISTINCT e la funzione COUNT

È possibile combinare la funzione di aggregazione COUNT() con la clausola DISTINCT per contare i valori unici presenti in un determinato campo. Tornando al nostro esempio di e-commerce:

SELECT COUNT(DISTINCT marca) FROM prodotti;

Questa query restituirà il valore 3, indicando cioè il numero di marche uniche disponibili nel database.

Oltre che con COUNT(), la sintassi SELECT DISTINCT può operare correttamente anche con le altre funzioni di aggregazione come SUM(), AVG(), MIN() e MAX().

SELECT DISTINCT su più colonne?

Nel nostro esempio abbiamo utilizzato il modificatore DISTINCT per individuare i valori unici in un singolo campo. Tuttavia, è possibile estendere questa sintassi per selezionare valori unici da più colonne. In questo caso è importante ricordare che la clausola agirà sull’insieme delle colonne selezionate e non individualmente su ciascuna colonna!

È bene precisare che in casi come questo l’utilizzo di SELECT DISTINCT potrebbe non essere la soluzione ottimale in quanto la sintassi offerta da GROUP BY consentirebbe una gestione più efficiente e flessibile delle query.

Ad esempio, la query:

SELECT DISTINCT nome, cognome FROM clienti;

potrebbe essere sostituita con:

SELECT nome, cognome FROM clienti GROUP BY nome, cognome;

L’adozione di GROUP BY non solo rende la query più performante ma fornisce anche un controllo e una flessibilità maggiori, facilitando l’aggregazione di dati e la manipolazione di gruppi di righe che condividono una certa proprietà.

Problematiche comuni nell’utilizzo di SELECT DISTINCT

Nell’utilizzare il comando SELECT DISTINCT, gli sviluppatori possono occasionalmente incappare in alcuni ostacoli o errori comuni. Essere consapevoli di queste potenziali insidie può aiutare a prevenire errori e ottimizzare l’efficienza delle query. Di seguito, esploriamo alcune delle trappole più comuni:

  1. Impatto negati vulle performance: l’uso indiscriminato di SELECT DISTINCT può, a volte, portare a un calo delle prestazioni, specialmente in tabelle con un grande numero di record. È pertanto consigliabile usarlo con discernimento e valutare sempre se ci sono alternative più efficienti.
  2. Errore nella selezione delle colonne: quando si utilizza SELECT DISTINCT su più colonne, è importante ricordare che la clausola agirà sull’insieme di colonne, e non individualmente su ciascuna colonna. Questo può a volte portare a risultati non attesi, soprattutto se non si è completamente consapevoli della distribuzione dei dati nelle colonne selezionate.
  3. Complicazioni con valori NULL: un’altra sfida comune è la gestione dei valori NULL. In SQL, due valori NULL non sono considerati identici, il che significa che SELECT DISTINCT mostrerà tutte le righe con valori NULL come righe separate nel resultset.
  4. Risultati imprevisti in caso di integrazione con altre funzioni SQL: quando combinato con altre funzioni SQL, come aggregazioni o JOIN, SELECT DISTINCT può a volte comportare complicazioni o risultati non previsti. È quindi importante testare attentamente le query per assicurarsi che funzionino come desiderato.

La consapevolezza di queste potenziali problematiche può aiutare gli sviluppatori ad approcciare l’uso di SELECT DISTINCT con una maggiore consapevolezza e precisione, garantendo query più efficienti e risultati più accurati.

Altri contenuti interessanti

Pubblicità
Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).

Leggi anche...

Come ottenere l’ID dell’ultimo record inserito in MySQL, PostgreSQL, SQL Server e Oracle?

Ottenere l'ID dell'ultimo record inserito in una tabella, dopo...

Database completo regioni, province e comuni italiani (in formato SQL)

Quando si sviluppa un sito web o un'applicazione in...

File CSV: cosa sono, come si aprono e come crearli

In questo articolo cercheremo di capire cos'è il formato...

Confrontare due tabelle e trovare i record senza corrispondenza

all'interno di un database relazionale può essere utile poter...

Eseguire comandi SQL online con SQL Fiddle

Sì. E' possibile testare codice SQL senza aver installato...

SQL: Calcolare la media dei valori di più campi

Attraverso una semplice query SQL è possibile calcolare dinamicamente...
Pubblicità