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

Introduzione agli operatori di set SQL: Unione, unione di tutti, meno e intersezione

Avete mai sentito termini come unione e intersezione in SQL? Sono esempi di operatori di insieme e sono utili quando è necessario combinare informazioni provenienti da più tabelle o query. In questo articolo li esamineremo più da vicino.

Le query SQL ci permettono di scegliere i dati più importanti da una grande quantità di informazioni. Naturalmente, non possiamo aspettarci che tutti i dati necessari siano memorizzati in un'unica tabella. Supponiamo di voler presentare ogni aspetto di un gruppo di dati chiave in un'unica tabella di risultati (ad esempio, un report con i nomi di tutti i clienti serviti da ogni reparto di una grande azienda). Questi record possono trovarsi in molte tabelle diverse, quindi abbiamo bisogno di operatori di insieme come unione e intersezione in SQL per unirli in un'unica tabella o per trovare elementi comuni.

Durante queste operazioni, prendiamo due o più risultati dalle istruzioni di SELECT e creiamo una nuova tabella con i dati raccolti. A tale scopo si utilizza un operatore SQL set. Operatori come MINUS, UNION o INTERSECT sono ampiamente utilizzati nelle query SQL. Vediamo come funzionano.

Le tabelle di esempio

Supponiamo di avere un database molto semplice che memorizza informazioni su libri e film. Ha solo due tabelle, BOOKS e MOVIESche contengono rispettivamente i titoli dei libri e dei film e un numero identificativo. Osservando queste tabelle, si nota che un titolo compare in entrambe:

Table: BOOKS
ID Title
1 The Witcher
2 Harry Potter
3 Nineteen Eighty-Four
4 The Great Gatsby

Table: MOVIES
ID Title
1 Iron Man
2 Harry Potter
3 Dr Strange
4 Matrix

L'operatore UNION Set

E se volessimo creare una tabella con tutto il contenuto delle tabelle BOOKS e MOVIES ? Questo è il momento perfetto per usare l'operatore set UNION.

UNION unisce i risultati di due istruzioni SELECT. Importante: le istruzioni UNION restituiscono solo valori UNIQUE. Di seguito è riportato un diagramma di Venn che rappresenta questa operazione e il codice che la realizza:

SELECT * FROM BOOKS
UNION
SELECT * FROM MOVIES

Ecco il risultato:

ID Title
1 The Witcher
2 Harry Potter
3 Nineteen Eighty-Four
4 The Great Gatsby
5 Iron Man
6 Dr Strange
7 Matrix

Tutti i titoli dei libri e dei film sono ora in un'unica tabella. Si noti che "Harry Potter", un elemento presente in entrambe le tabelle, viene visualizzato solo una volta nei risultati. Come abbiamo già detto, l'operatore set UNION non restituisce valori duplicati.

L'operatore UNION ALL

Probabilmente avrete capito che UNION ALL è molto simile a UNION, ma con un'eccezione: UNION ALL restituisce tutti i dati di tutte le tabelle, indipendentemente dal fatto che siano duplicati o meno. Eseguiamo la stessa operazione dell'esempio UNION e vediamo cosa otteniamo:

SELECT * FROM BOOKS
UNION ALL
SELECT * FROM MOVIES

Risultato:

ID Title
1 The Witcher
2 Harry Potter
3 Nineteen Eighty-Four
4 The Great Gatsby
5 Iron Man
6 Harry Potter
7 Dr Strange
8 Matrix

Questa volta, la piccola procedura guidata appare due volte nella tabella dei risultati.

Ora conosciamo la differenza principale tra questi due operatori. Ma quando è opportuno utilizzare UNION e quando UNION ALL? Innanzitutto, sappiate che c'è un'enorme differenza di efficienza tra i due operatori. Supponiamo di dover unire due risultati di query contenenti ciascuno 10.000 elementi. UNION eliminerà tutti i duplicati e ordinerà tutti gli elementi nella tabella dei risultati. Questo processo di ordinamento richiede molto tempo e lavora con un numero elevato di elementi.

Insomma, UNION può essere quattro volte più lento di UNION ALL, che non elimina i duplicati e non ordina i dati. Se non ci interessano i duplicati e vogliamo lavorare velocemente, UNION ALL è la soluzione perfetta. Ma se sappiamo che avere elementi unici è il nostro obiettivo principale, allora UNION sarà molto più utile.

L'operatore set MINUS

MINUS è un po' diverso. Supponiamo di voler vedere solo i titoli dei libri che non sono anche titoli di film. Dobbiamo "togliere" tutto ciò che è presente nella tabella BOOKS che si trova anche nella tabella MOVIES tabella. L'operatore MINUS è stato progettato per questo tipo di operazioni.

SELECT * FROM BOOKS
MINUS
SELECT * FROM MOVIES

Il risultato:

ID Title
1 The Witcher
2 Nineteen Eighty-Four
3 The Great Gatsby

Ora "Harry Potter" non compare nella tabella dei risultati; è il titolo di un libro e di un film. Grazie all'operatore set MINUS siamo in grado di vedere solo i titoli presenti nella prima tabella e non presenti nella seconda.

A proposito, alcuni database utilizzano la parola chiave EXCEPT invece di MINUS. Non preoccupatevi: la funzione e i risultati sono esattamente gli stessi.

L'operatore set INTERSECT

Ok, sappiamo come sommare e sottrarre alcuni elementi utilizzando gli operatori UNION e MINUS. Ma cosa fare se abbiamo bisogno di sapere cosa hanno in comune due query?

Questo è il ruolo principale dell'operatore INTERSECT. Vediamo come funziona.

SELECT * FROM BOOKS
INTERSECT
SELECT * FROM MOVIES

E il risultato:

ID Title
1 Harry Potter

Ormai sapete che "Harry Potter" (e solo "Harry Potter") è presente in entrambe le tabelle. Quindi è l'unico elemento della tabella dei risultati.

Meno, Unione, Intersezione in SQL: Consigli pratici

Ci sono alcune cose da ricordare riguardo a meno, unione e intersezione in SQL:

  1. Se i nomi delle colonne o gli alias da confrontare sono diversi, la colonna del risultato verrà chiamata dopo la colonna della prima query SELECT.
  2. È possibile utilizzare i risultati delle query o le tabelle con gli operatori di set.
  3. Le colonne da confrontare devono essere dello stesso tipo e di numero uguale.
  4. La tabella dei risultati avrà sempre un numero maggiore di colonne di precisione.

Gli operatori MINUS, UNION e INTERSECT ordinano sempre i risultati restituiti; UNION ALL non lo fa. Se si desidera un certo ordine o tipo di ordinamento, si può sempre usare un ORDER BY alla fine della query. Ma si tenga presente che questo ordina l'intera query! Non si può usare ORDER BY prima di un operatore SQL set o cercare di ordinare ogni SELECT separatamente.

È bene ricordare che in SQL è possibile utilizzare operatori di insieme come meno, unione e intersezione in tutti i tipi di query. Non è necessario selezionare tutti i record di entrambe le tabelle; possiamo lavorare sui risultati delle query esistenti.

È sorprendente quello che possiamo fare con gli operatori di set come meno, unione e intersezione in SQL. Grazie ad essi, possiamo trovare e presentare facilmente dati interessanti. Fate un po' di esperienza pratica nel lavoro con gli operatori di set SQL e altre funzioni con il corso LearnSQL.it di SQL Basics. Iniziate un nuovo entusiasmante viaggio nei dati nel modo giusto!