Nelle lezioni precedenti abbiamo visto come utilizzare i JOIN per collegare colonne provenienti da più tabelle e ottenere un risultato combinato orizzontalmente.
Esiste però un'altra situazione in cui possiamo avere bisogno di combinare i risultati di più query: quando vogliamo mettere uno sotto l'altro i risultati di due o più SELECT.
Per questo scopo possiamo utilizzare gli operatori di insieme, come UNION e UNION ALL.
A differenza dei JOIN, che combinano i dati delle tabelle affiancando le colonne, gli operatori di insieme combinano i risultati verticalmente, aggiungendo le righe di una query a quelle di un'altra.
UNION permette di unire due query SELECT insieme.
Supponiamo di avere due tabelle, clienti_italiani e clienti_esteri. Possiamo combinare i risultati delle due tabelle così:
SELECT nome, email
FROM clienti_italiani
UNION
SELECT nome, email
FROM clienti_esteri;Le righe della seconda SELECT vengono aggiunte sotto quelle della prima.
Per poter utilizzare UNION, le query di SELECT coinvolte devono rispettare alcune regole:
Inoltre, nel risultato finale vengono utilizzati i nomi delle colonne della prima SELECT.
Ad esempio, questa query non può essere eseguita:
SELECT nome, email
FROM clienti_italiani
UNION
SELECT nome
FROM clienti_esteri;Nell'esempio, infatti, la prima query restituisce due colonne, mentre la seconda ne restituisce una.
Nell'unione di tabelle, UNION elimina automaticamente le righe duplicate.
Ad esempio, se abbiamo due tabelle con liste di email:
SELECT email
FROM clienti_italiani
UNION
SELECT email
FROM clienti_esteri;UNION considera il risultato complessivo e rimuove le righe duplicate, con un comportamento simile a DISTINCT, che abbiamo visto nella lezione sulla selezione dei dati.
UNION rimuove automaticamente i duplicati dal risultato della query. Se vogliamo mantenere tutte le righe, comprese quelle duplicate, possiamo utilizzare UNION ALL.
Ad esempio, possiamo scrivere:
SELECT email
FROM clienti_italiani
UNION ALL
SELECT email
FROM clienti_esteri;UNION deve verificare la presenza di eventuali duplicati prima di restituire il risultato. UNION ALL, invece, non deve effettuare questa operazione e può quindi essere più veloce, soprattutto quando le query restituiscono molte righe.
Possiamo utilizzare ORDER BY, clausola che abbiamo visto nella lezione sull'ordinamento, per ordinare il risultato complessivo dell'unione.
Ad esempio:
SELECT nome, email
FROM clienti_italiani
UNION
SELECT nome, email
FROM clienti_esteri
ORDER BY nome;In questo caso ORDER BY viene applicato al risultato finale dell'intero UNION.