Operatori di insieme in SQL

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.

Unione dei risultati con UNION

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.

Regole di compatibilità

Per poter utilizzare UNION, le query di SELECT coinvolte devono rispettare alcune regole:

  1. Le query devono restituire lo stesso numero di colonne.
  2. Le colonne che occupano la stessa posizione devono avere tipi di dato compatibili.

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.

I duplicati

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.

Mantenere i duplicati

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.

Ordinare i risultati di UNION

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.

Prova!Completa gli spazi vuoti con il testo appropriato.
-- Unisci i risultati mantenendo i duplicati
SELECT email
FROM clienti_italiani

UNION

SELECT email
FROM clienti_esteri;