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

Qual è la differenza tra UNIQUE e DISTINCT in SQL?

Nella vita di tutti i giorni usiamo le parole unico e distinto in modo intercambiabile. Tuttavia, in SQL queste parole svolgono ruoli molto diversi. Scopriamo cosa c'è di così diverso e come possiamo usarle in SQL.

Nonostante le parole unique e distinct siano sinonimi, in SQL hanno un ruolo molto diverso. La parola chiave UNIQUE in SQL svolge il ruolo di vincolo del database; garantisce che non ci siano valori duplicati in una particolare colonna o in un insieme di colonne. D'altra parte, la parola chiave DISTINCT viene utilizzata nell'istruzione SELECT per recuperare righe distinte da una tabella.

Il posto migliore per imparare a conoscere SQL e i database è LearnSQL.it. È una piattaforma online progettata per aiutarvi a padroneggiare tutti gli argomenti relativi ai database. Offre più di 30 corsi SQL, tra cui un percorso completo SQL from A to Z con il percorso di apprendimento interattivo completo di SQL o Creazione della struttura del database che vi insegnerà i vincoli del database come UNIQUE.

Vediamo nel dettaglio le parole chiave UNIQUE e DISTINCT in SQL.

La parola chiave DISTINCT in SQL

La parola chiave DISTINCT in SQL viene utilizzata con l'istruzione SELECT. Utilizzando SELECT immediatamente seguito dalla parola chiave DISTINCT, tutte le righe duplicate vengono rimosse dall'insieme dei risultati.

Vediamo un esempio di DISTINCT in azione.

Ci viene data la tabella Cars che contiene le informazioni sulla marca e sul modello di alcune automobili:

IdBrandModelProductionYear
AQ16AudiQ72011
FK19FordKuga2019
JC07JeepCherokee2012
JW15JeepWrangler2015
TS14TeslaModel S2014
TY20TeslaModel Y2020

Eseguiamo una semplice istruzione SELECT per ottenere tutte le marche di automobili prodotte dopo il 2011:

SELECT Brand 
FROM Cars 
WHERE ProductionYear > 2011;

Il risultato della query precedente è il seguente.

Brand
Ford
Jeep
Jeep
Tesla
Tesla

Come si può notare, abbiamo valori duplicati per Jeep e Tesla. E se volessimo un singolo record per ogni valore? Utilizziamo la parola chiave DISTINCT:

SELECT DISTINCT Brand 
FROM Cars 
WHERE ProductionYear > 2011;

E il risultato è...

Brand
Ford
Jeep
Tesla

Ora si capisce quanto sia facile e conveniente usare la parola chiave DISTINCT.

Per un approfondimento sulla parola chiave DISTINCT in SQL, consultate il nostro articolo su Qual è il ruolo di DISTINCT in SQL.

La parola chiave UNIQUE in SQL

La parola chiave UNIQUE in SQL indica uno dei vincoli del database. Utilizzando il vincolo UNIQUE su una colonna o su un insieme di colonne, è possibile impedire che in questa colonna o in questo insieme vengano memorizzati valori duplicati (cioè la combinazione dei valori delle colonne deve essere unica, anche se ogni valore potrebbe essere presente più volte nella stessa colonna).

Vediamo il vincolo UNIQUE in azione. Creeremo una tabella Person che contiene il nome, il numero di previdenza sociale e la nazionalità di una persona.

CREATE TABLE Person (
	RowId INTEGER PRIMARY KEY,
	FirstName varchar(50),
	LastName varchar(50),
	SSN varchar(20) UNIQUE,
	Nationality varchar(30)
);

In questo caso, la colonna SSN deve memorizzare solo valori non duplicati; pertanto, nella definizione di questa colonna è presente la parola chiave UNIQUE, che impone il vincolo UNIQUE.

Per fare più pratica con la creazione di tabelle e la progettazione del database, consultate la nostra traccia sulla creazione della struttura del database. Include le basi della creazione di tabelle, i tipi di dati SQL, i vincoli e altro ancora. Per un approfondimento della traccia, leggete questo articolo.

Ora inseriamo alcuni valori nella tabella. Person tabella.

INSERT INTO Person VALUES (1, 'John', 'Black', '321456987123', 'American');
INSERT INTO Person VALUES (2, 'Isabella', 'Sanchez', '987456345123', 'Spanish');
INSERT INTO Person VALUES (3, 'Klaus', 'Schmidt', '987456345123', 'German');

Si verifica un errore alla terza istruzione INSERT. Perché? Perché è stato definito un vincolo UNIQUE sulla colonna SSN; quindi, lo stesso valore non può comparire due volte nella colonna SSN. Sia Isabella che Klaus hanno lo stesso valore SSN, quindi riceviamo un messaggio di errore. Non abbiamo rispettato le regole stabilite dal vincolo UNIQUE.

Se cambiamo l'ultima istruzione INSERT in...

INSERT INTO Person VALUES (3, 'Klaus', 'Schmidt', '876456345123', 'German');

... viene accettato nella tabella. Dopo l'esecuzione di tutte e tre le istruzioni di INSERT, compresa la terza istruzione corretta, la tabella si presenta come segue Person tabella si presenta in questo modo:

RowIdFirstNameLastNameSSNNationality
1JohnBlack321456987123American
2IsabellaSanchez987456345123Spanish
3KlausSchmidt876456345123German

Il vincolo UNIQUE impedisce che qualsiasi INSERTs o UPDATEs a una tabella risulti in valori duplicati nella colonna o nell'insieme di colonne che implementa il vincolo.

Quindi, la tabella sottostante viola il vincolo UNIQUE impostato sulla colonna SSN...

RowIdFirstNameLastNameSSNNationality
1JohnBlack321456987123American
2IsabellaSanchez987456345123Spanish
3KlausSchmidt987456345123German

...e questa tabella obbedisce al vincolo UNIQUE impostato sulla colonna SSN.

RowIdFirstNameLastNameSSNNationality
1JohnBlack321456987123American
2IsabellaSanchez987456345123Spanish
3KlausSchmidt876456345123German

È possibile definire il vincolo UNIQUE durante la creazione della tabella, come mostrato qui, o dopo la creazione della tabella. Il vincolo UNIQUE può anche essere modificato o rimosso in seguito. Per sapere come fare, consultate l'articolo Che cos'è un vincolo univoco in SQL? Offriamo anche un corso interattivo sui vincoli SQL per aiutarvi a comprendere i diversi vincoli che SQL mette a disposizione.

Mettere tutto insieme: UNIQUE vs. DISTINCT in SQL

Abbiamo definito le parole chiave UNIQUE e DISTINCT. Ma quali sono le differenze effettive tra di esse?

La parola chiaveUNIQUE indica un vincolo di database e viene definita durante la creazione di una tabella o successivamente su una colonna specifica o su un insieme di colonne. La parola chiaveDISTINCT viene utilizzata durante il recupero del set di risultati dal database. Segue direttamente laparola chiaveSELECT quando ci si vuole assicurare che tutte le righe del set di risultati contengano valori distinti o un insieme distinto di valori.

Sappiamo che è sempre bene fare più pratica possibile, quindi abbiamo preparato un programma che vi aiuterà a imparare ed esercitarvi. SQL Practice Set che vi aiuterà a imparare e a mettere in pratica tutte le diverse funzionalità offerte da SQL. Per motivarvi, date un'occhiata al nostro articolo sulla SQL Practice Set.

Buona fortuna!