La clausola SELECT DISTINCT in SQL

La tua tabella potrebbe contenere valori duplicati in una colonna e in certi scenari potresti aver bisogno di recuperare solo record unici dalla tabella.

Per rimuovere i record duplicati dai dati recuperati con l’istruzione SELECT, potete usare la clausola DISTINCT come mostrato negli esempi qui sotto.

Un demo di semplice SELECT – DISTINCT

Nel primo esempio, ho usato la clausola DISTINCT con l’istruzione SELECT per recuperare solo nomi unici dalla nostra tabella demo, sto_emp_salary_paid. Questa tabella memorizza gli stipendi dei dipendenti insieme ai loro nomi. Quindi, le occorrenze duplicate dei nomi dei dipendenti si verificano nella tabella.

Utilizzando la clausola DISTINCT, otteniamo solo i nomi unici dei dipendenti:

Query:

SELECT DISTINCT(emp_name) FROM sto_emp_salary_paid;

SQL DISTINCT

(Si applica ai database SQL Server e MySQL)

Utilizzando la clausola WHERE con DISTINCT

In questo esempio, Ho usato la clausola WHERE con l’istruzione SELECT/DISTINCT per recuperare solo i dipendenti unici ai quali lo stipendio pagato è maggiore o uguale a 4500. Vedere la query e il set di risultati:

Query:

1
2
3

SELECT DISTINCT(emp_name) FROM sto_emp_salary_paid
WHERE emp_sal_paid >= 4500;

SQL DISTINCT WHERE

L’esempio della funzione COUNT con DISTINCT

Si può anche usare la funzione COUNT SQL per ottenere il numero di record come usando la clausola DISTINCT. La funzione restituisce solo il conteggio per le righe restituite dopo la clausola DISTINCT.

Per la demo, sto usando la tabella dei dipendenti che memorizza le informazioni sui dipendenti. Tre query sono usate nella demo come segue:

  • La prima query restituisce il record completo dalla tabella
  • La seconda query ottiene il numero di dipendenti usando ID (COUNT e DISTINCT)
  • Mentre la terza restituisce i nomi unici dei dipendenti usando la colonna emp_name.

Le tre query sono:

1
2
3
4
5
6
7

SELECT * FROM sto_employees;
SELECT COUNT(DISTINCT id) AS “Totale dipendenti” FROM sto_employees
SELECT COUNT(DISTINCT emp_name) AS “Nomi unici dipendenti” FROM sto_employees

SQL DISTINCT COUNT

La clausola DISTINCT con l’esempio GROUP BY

La seguente query recupera i record dalla stessa tabella utilizzata negli esempi precedenti e raggruppa gli stipendi pagati dai dipendenti. Per questo, le clausole GROUP BY e DISTINCT sono usate come segue:

La query:

1
2
3

SELECT DISTINCT(emp_name),emp_id, SUM(emp_salario_pagato) come “Totale pagato” FROM sto_emp_salario_pagato
GROUP BY emp_name,emp_id;

SQL DISTINCT GROUP-BY

Il record di “Jimmy” appare due volte perché ha due ID diversi.

Utilizzando la clausola HAVING con DISTINCT

Come usando la clausola GROUP BY con DISTINCT, potete anche aggiungere la clausola HAVING per recuperare i record. Nella seguente query, la clausola HAVING viene aggiunta nell’esempio precedente e andremo a prendere i record la cui SOMMA è maggiore di 5000.

La query:

1
2
3
4
5

SELECT DISTINCT(emp_name),emp_id, SUM(emp_salario_pagato) As “Totale pagato” FROM sto_emp_salario_pagato
GROUP BY emp_name,emp_id
HAVING SUM(emp_salario_pagato) > 5000;

SQL DISTINCT HAVING

La clausola DISTINCT con Esempio di ORDER BY

La clausola SQL ORDER BY può essere usata con la clausola DISTINCT per ordinare i risultati dopo aver rimosso i valori duplicati. Vedere la query e l’output qui sotto:

1
2
3

SELECT DISTINCT(emp_name) FROM sto_emp_salary_paid
ORDER BY emp_name;

Il risultato:

SQL DISTINCT ORDER-BY

Utilizzare più colonne nella clausola DISTINCT

È possibile anche specificare due o più colonne utilizzando la clausola SELECT – DISTINCT. Come tale, la nostra tabella di esempio contiene valori duplicati per i dipendenti e i loro ID, quindi sarà un buon apprendimento vedere come la clausola DISTINCT restituisce i record utilizzando entrambe queste colonne nella singola query.

Per vedere la differenza, ho scritto prima una query con DISTINCT (emp_name) che è seguita dall’utilizzo di entrambe le colonne:

La query:

1
2
3
4
5
6
7
8
9

SELECT DISTINCT emp_name FROM sto_emp_salary_paid
ORDER BY emp_name;
SELECT DISTINCT emp_name,emp_id FROM sto_emp_salary_paid
ORDER BY emp_name;

I risultati della tabella completa, delle query DISTINCT emp_name e DISTINCT emp_name,emp_id:

SQL DISTINCT multi colonne

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *