Vai al contenuto principale

Operatori di insieme in SQL: una guida completa

Padroneggia gli operatori di insieme in SQL: UNION, UNION ALL, INTERSECT ed EXCEPT. Impara le regole di sintassi, vedi esempi pratici e capisci quando usare ciascun operatore.
Aggiornato 2 giu 2026  · 11 min leggi

Le operazioni sugli insiemi sono alla base di SQL e ci permettono di combinare, confrontare e filtrare dati da più fonti. Queste operazioni sono indispensabili per attività che vanno dall’integrazione e pulizia dei dati all’analisi avanzata e alla reportistica.

In questo tutorial vedremo cosa sono gli operatori di insieme, come si usano in SQL, le loro applicazioni pratiche e altro ancora! Se cerchi una risorsa completa per imparare SQL, dai un’occhiata al percorso di competenze in sette corsi SQL Fundamentals.

Per chi ha fretta, iniziamo con una risposta molto breve su cosa sono le operazioni di insieme in SQL.

Cosa sono le operazioni di insieme in SQL?

Le operazioni di insieme in SQL sono tecniche per combinare o confrontare i risultati di due o più istruzioni SELECT. Funzionano come le operazioni insiemistiche matematiche, permettendoci di trovare l’unione, l’intersezione o la differenza tra le righe restituite dalle query. Questo le rende indispensabili quando si analizzano dati da più fonti o prospettive.

Ecco una rapida panoramica delle principali operazioni di insieme:

  • UNION: unisce tutte le righe uniche da due o più istruzioni SELECT, eliminando i duplicati.

  • UNION ALL: unisce tutte le righe da due o più istruzioni SELECT, mantenendo i duplicati.

  • INTERSECT: restituisce solo le righe che compaiono in entrambe le istruzioni SELECT.

  • EXCEPT: restituisce le righe della prima istruzione SELECT che non compaiono nella seconda.

Confronto con le operazioni di algebra relazionale

L’algebra relazionale è un quadro teorico che fornisce le basi per comprendere le query sui database. Offre operazioni astratte come proiezione, selezione e join, radicate in principi matematici e indipendenti da specifici sistemi di database. Pensala come la logica “dietro le quinte” che alimenta le nostre interazioni con il database.

Gli operatori di insieme in SQL offrono un’implementazione pratica di questi concetti all’interno di un ambiente di database. Ci permettono di eseguire direttamente sui result set delle query SQL operazioni come unione, intersezione e differenza.

Se da un lato l’algebra relazionale fornisce un fondamento formale per le operazioni sui database, dall’altro gli operatori di insieme in SQL offrono un’interfaccia standardizzata e intuitiva per i compiti di manipolazione dei dati.

Capire la relazione tra operatori di insieme e operazioni di algebra relazionale offre spunti sui fondamenti teorici di SQL. Conoscere questo legame ti aiuta a scrivere query con un modello mentale più chiaro di ciò che accade “sotto il cofano”.

Tipi di operatori di insieme in SQL

In SQL esistono tre operatori di insieme principali:

  • UNION

  • INTERSECT

  • EXCEPT (oppure MINUS in alcuni dialetti)

Questi operatori corrispondono matematicamente ai concetti di unione, intersezione e differenza tra insiemi.

Regole per l’uso degli operatori di insieme

Prima di combinare query con gli operatori di insieme, devono essere soddisfatti quattro requisiti. Se ne sbagli uno, la query genererà un errore.

  • Stesso numero di colonne: ogni SELECT deve restituire lo stesso numero di colonne. Se una query ne restituisce tre e un’altra due, il database genera un errore.

  • Tipi di dato compatibili: le colonne corrispondenti devono avere tipi compatibili. Non puoi combinare una colonna VARCHAR con i nomi con un INTEGER con gli ID nella stessa posizione.

  • Stesso ordine delle colonne: SQL associa le colonne per posizione, non per nome. La prima colonna della prima query corrisponde alla prima colonna della seconda query, a prescindere da come si chiamano.

  • ORDER BY solo alla fine: ORDER BY deve comparire una sola volta, alla fine della query combinata. Non puoi usarlo all’interno delle singole istruzioni SELECT.

Un altro dettaglio: i nomi delle colonne in output provengono dalla prima istruzione SELECT. Gli alias nelle query successive vengono ignorati, quindi aggiungi alias solo alla prima query se ti servono nomi personalizzati in output.

Come usare l’operatore UNION in SQL

L’operatore UNION combina i risultati di due o più query SELECT in un unico result set, rimuovendo per impostazione predefinita le righe duplicate.

Per esempio, supponiamo di avere due tabelle, employees e contractors, ciascuna con colonne simili come contractors, department e salary. Per scopi didattici, consideriamo queste due tabelle di esempio:

employees:

name

department

salary

Alice

Marketing

65000

Bob

Sales

70000

Carol

Engineering

80000

John

HR

55000

contractors:

name

department

salary

David

Marketing

60000

Eva

Sales

68000

Carol

Engineering

75000

Possiamo combinare i risultati di entrambe le tabelle con il seguente comando:

-- Using UNION to combine all employees and contractors
SELECT name, department, salary FROM employees
UNION
SELECT name, department, salary FROM contractors;

Questa query seleziona le colonne name, department e salary sia dalla tabella employees sia dalla tabella contractors e le combina in un unico result set. L’operatore UNION rimuove automaticamente le righe duplicate dal result set finale.

name

department

salary

Alice

Marketing

65000

Bob

Sales

70000

Carol

Engineering

80000

John

HR

55000

David

Marketing

60000

Eva

Sales

68000

Nota che Carol, presente in entrambe le tabelle, è elencata una sola volta nel risultato. Se volessimo mantenere entrambe le occorrenze di Carol (con i suoi stipendi diversi), useremmo UNION ALL.

UNION vs UNION ALL

L’operatore UNION non rimuove i valori NULL. Se una colonna contiene valori NULL in un result set e valori non NULL nella colonna corrispondente dell’altro result set, i valori NULL verranno mantenuti nel result set finale prodotto dall’operatore UNION.

Se vogliamo includere i valori NULL nel result set ed evitare che vengano rimossi dall’operatore UNION, possiamo usare l’operatore UNION ALL. Questo operatore combina i risultati di più query SELECT, includendo tutte le righe di ciascun result set, indipendentemente dal fatto che siano duplicate o contengano valori NULL.

Come usare l’operatore INTERSECT in SQL

L’operatore INTERSECT restituisce solo le righe che compaiono in entrambi i result set. Pensalo come trovare le persone che appartengono a entrambi i gruppi.

Usiamo INTERSECT per interrogare le nostre tabelle qui sopra. Per l’esempio, interroghiamo solo le colonne name e department:

-- Using INTERSECT to find common employees
SELECT name, department FROM employees
INTERSECT
SELECT name, department FROM contractors;

Questa query seleziona le colonne name e department sia dalla tabella employees sia dalla tabella contractors e restituisce solo le righe che esistono in entrambe le tabelle in base a tutte le colonne selezionate.

name

department

Carol

Engineering

L’operatore INTERSECT gestisce i valori NULL in base alle regole di confronto standard, considerando uguali i valori NULL quando si confrontano colonne corrispondenti. Inoltre produce un insieme vuoto quando si lavora con result set vuoti.

In altre parole, se in un result set è presente un valore NULL e nella colonna corrispondente dell’altro result set c’è un valore non NULL, le righe non sono considerate uguali – non verranno incluse nel risultato dell’intersezione.

Inoltre, se uno dei result set forniti all’operatore INTERSECT è vuoto, anche il risultato complessivo è vuoto. Non ci sono righe in comune tra un insieme vuoto e qualsiasi altro.

Come usare l’operatore UNION in SQL

L’operatore EXCEPT restituisce le righe del primo result set che non sono nel secondo.

In Oracle Database, EXCEPT si scrive come MINUS; tutti gli altri principali dialetti (PostgreSQL, SQL Server, MySQL 8.0.31+, SQLite) usano EXCEPT.

Per esempio, supponiamo di eseguire la seguente query:

-- Using EXCEPT to find employees who are not contractors
SELECT name, department, salary FROM employees
EXCEPT
SELECT name, department, salary FROM contractors;

Le colonne name, department e salary vengono selezionate dalla tabella employees e restituiscono solo le righe che non esistono nella tabella contractors.

name

department

salary

Alice

Marketing

65000

Bob

Sales

70000

John

HR

55000

L’operatore EXCEPT segue inoltre le regole di confronto standard per la gestione dei valori NULL. Il suo comportamento con result set vuoti produce un insieme vuoto se il primo result set è vuoto oppure include tutte le righe del primo result set se il secondo result set è vuoto.

Operatori di insieme in SQL: prestazioni e ottimizzazione

L’impatto degli operatori di insieme sulle prestazioni delle query in SQL può variare in base a fattori come la dimensione dei dataset coinvolti, la complessità delle query e il sistema di gestione di database (DBMS) utilizzato.

Vediamo i fattori chiave e le strategie di ottimizzazione.

Volume dei dati e complessità delle query

Quando si lavora con grandi moli di dati, gli operatori di insieme possono incidere significativamente sulle prestazioni delle query perché la dimensione dei result set da combinare, intersecare o confrontare aumenta il tempo di elaborazione necessario per eseguire l’operazione.

Query complesse che contengono più sottoquery, join o operatori di insieme possono comportare un sovraccarico di elaborazione aggiuntivo e influire sulle prestazioni. Operazioni concatenate o operatori di insieme annidati potrebbero aggravare ulteriormente le conseguenze sulle prestazioni.

Indicizzazione e tecniche di ottimizzazione

Una corretta indicizzazione delle colonne coinvolte nelle operazioni di insieme può migliorare sensibilmente le prestazioni delle query. Gli indici aiutano il motore del database a individuare e recuperare rapidamente le righe pertinenti, riducendo la necessità di scansioni complete delle tabelle e migliorando i tempi di esecuzione.

Per migliorare le prestazioni delle query che coinvolgono operatori di insieme, amministratori di database e sviluppatori possono applicare tecniche come il rewriting delle query, l’analisi dei piani di esecuzione e l’ottimizzazione dello schema. Tecniche come il caching delle query e le viste materializzate possono anche essere utilizzate per precomputare e memorizzare i risultati di query complesse, riducendo il carico computazionale delle operazioni di insieme.

Motore di database e risorse hardware

Le prestazioni delle operazioni di insieme possono variare a seconda del motore di database sottostante e delle sue capacità di ottimizzazione. Diversi DBMS possono adottare strategie e algoritmi di ottimizzazione differenti per elaborare le operazioni di insieme, con conseguenti variazioni nelle prestazioni.

La disponibilità di risorse hardware come CPU, memoria e I/O su disco influisce inoltre sulle prestazioni delle query che coinvolgono operatori di insieme. Risorse hardware adeguate possono aiutare a mitigare i colli di bottiglia e garantire un’esecuzione efficiente delle query.

Operatori di insieme SQL nella pratica

Gli operatori di insieme non sono solo strumenti teorici; hanno applicazioni reali che possono influire in modo significativo sulle decisioni di business. Vediamo un esempio semplificato di come un’azienda potrebbe usare gli operatori di insieme per segmentare la propria base clienti per campagne di marketing mirate.

Lo scenario

Immagina un’azienda che vende sia online che in negozi fisici. Ha due dataset separati:

  1. Acquisti online: ID cliente, cronologia degli acquisti, dati demografici e posizione per i clienti online.
  2. Transazioni in negozio: Informazioni simili per i clienti che hanno acquistato di persona.

Uso degli operatori di insieme

Per ottenere una visione completa di tutti i clienti, l’azienda userebbe innanzitutto UNION per combinare entrambi i dataset in un’unica tabella, rimuovendo eventuali duplicati. Questo offre una vista unificata dell’intera base clienti.

Successivamente, potrebbe usare INTERSECT per identificare i clienti che hanno acquistato sia online che in negozio. Questo segmento è particolarmente prezioso perché è molto coinvolto con il brand su più canali.

Per trovare opportunità di promozione cross-canale, l’azienda potrebbe usare EXCEPT. Per esempio, SELECT * FROM online_purchases EXCEPT SELECT * FROM in_store_transactions troverebbe i clienti che hanno acquistato solo online ma non in negozio. L’azienda potrebbe quindi indirizzare questi clienti con promozioni che li incoraggino a visitare un punto vendita fisico.

Oltre la segmentazione

Identificati questi segmenti, l’azienda può spingersi oltre, raffinando in base a fattori aggiuntivi come dati demografici o cronologia degli acquisti. Questa comprensione granulare dei clienti consente di creare campagne di marketing più mirate.

Operatori di insieme vs JOIN

Sia gli operatori di insieme sia i JOIN in SQL combinano dati da più query, ma funzionano in modo diverso. La domanda centrale è se vuoi combinare righe o colonne.

Feature Set Operators JOINs
Combines Rows (stacks queries vertically) Columns (widens rows horizontally)
Requires Same column count and compatible data types A shared key column between tables
Use when Merging similar datasets, finding overlaps or differences between result sets Enriching a row with related data from another table
Duplicate handling UNION removes duplicates; UNION ALL keeps them Depends on join type and the data
Types UNION, UNION ALL, INTERSECT, EXCEPT/MINUS INNER, LEFT, RIGHT, FULL OUTER, CROSS

Limitazioni e considerazioni sugli operatori di insieme

Quando usi gli operatori di insieme in SQL, è fondamentale considerare diverse limitazioni e fattori che possono influire sulle prestazioni delle query, sull’accuratezza dei risultati e sulla fruibilità complessiva.

Compatibilità dei tipi di dato e valori NULL

Le colonne corrispondenti nei result set devono avere tipi di dato compatibili. Verifica che le colonne corrispondenti condividano tipi di dato compatibili prima di combinare le query. Le incongruenze di tipo causano errori facili da sfuggire.

Gli operatori di insieme possono trattare i valori NULL in modo diverso a seconda del DBMS e dell’operatore specifico. Per evitare errori, è importante capire come vengono trattati i valori NULL.

Impatto sulle prestazioni e righe duplicate

Le operazioni di insieme possono incidere in modo significativo sulle prestazioni delle query, soprattutto quando si lavora con dataset grandi o complessi. Fattori come indicizzazione, ottimizzazione delle query e risorse hardware possono influenzare le prestazioni. Tecniche di ottimizzazione e strategie di tuning sono fondamentali per mitigare i colli di bottiglia.

Per impostazione predefinita, gli operatori di insieme rimuovono le righe duplicate dal result set. Tuttavia, in alcuni casi può essere necessario mantenere i duplicati. È importante capire il comportamento degli operatori di insieme rispetto ai duplicati e usare tecniche appropriate per gestirli quando serve.

Ordinamento dei risultati e vincoli di memoria

Gli operatori di insieme non garantiscono l’ordine dei risultati nell’output finale. Per ordinare il risultato combinato, aggiungi una clausola ORDER BY proprio alla fine dell’intera query, dopo l’ultima istruzione SELECT.

Le operazioni di insieme possono consumare memoria e risorse significative, in particolare quando si lavora con dataset di grandi dimensioni. Vincoli di memoria e limitazioni delle risorse vanno considerati per evitare degrado delle prestazioni o instabilità del sistema.

Complessità, manutenibilità e compatibilità cross-DBMS

Query complesse che coinvolgono più operatori di insieme, sottoquery e join possono essere difficili da comprendere, mantenere e fare debug. Per migliorare leggibilità e manutenibilità, le query devono essere concise, ben documentate e modulari.

Gli operatori di insieme possono presentare variazioni di sintassi e comportamento tra diversi sistemi di gestione di database (DBMS). Conoscere queste differenze è fondamentale quando si scrivono query SQL per la compatibilità multipiattaforma.

Considerazioni finali

Gli operatori di insieme risolvono un problema specifico: combinare o confrontare result set senza sapere in anticipo quali righe si sovrappongono.

Coprono UNION, INTERSECT ed EXCEPT: i tre operatori per combinare, confrontare e sottrarre result set.

Se vuoi saperne di più, dai un’occhiata a questo corso su Joining Data in SQL.

FAQ sugli operatori SQL

Qual è la differenza tra UNION ALL e UNION?

UNION ALL include tutte le righe di entrambe le query, anche se sono duplicate. UNION elimina le righe duplicate.

In che cosa UNION è diversa da JOIN in SQL?

UNION combina i risultati delle query in verticale, accodando le righe di una query all’altra. JOIN combina le tabelle in orizzontale, abbinando le righe in base a una colonna correlata e creando un result set più ampio.

Ci sono considerazioni sulle prestazioni quando si usano le operazioni di insieme?

Le operazioni di insieme possono essere costose dal punto di vista computazionale, soprattutto quando si lavora con dataset di grandi dimensioni. È importante ottimizzare le singole query e usare indici dove possibile per migliorare le prestazioni.

Qual è la differenza tra EXCEPT e NOT IN?

EXCEPT e NOT IN possono produrre risultati simili, ma si comportano diversamente con i valori NULL. EXCEPT considera uguali i valori NULL quando confronta le righe, quindi due valori NULL nella stessa posizione di colonna faranno escludere una riga. NOT IN, invece, non restituisce alcuna riga se la sottoquery contiene valori NULL, perché i confronti con NULL in SQL non sono definiti. Per dataset grandi, EXCEPT può anche risultare più leggibile di una sottoquery correlata con NOT IN.

Posso usare ORDER BY con gli operatori di insieme?

Sì, ma una sola volta, alla fine dell’intera query. Non puoi usare ORDER BY all’interno delle singole istruzioni SELECT in un’operazione di insieme. Per ordinare il risultato combinato, aggiungi un’unica clausola ORDER BY dopo l’ultima istruzione SELECT.

Esempio:

SELECT name FROM employees
UNION
SELECT name FROM contractors
ORDER BY name ASC;

MySQL supporta INTERSECT ed EXCEPT?

MySQL ha aggiunto il supporto per INTERSECT ed EXCEPT nella versione 8.0.31. Se usi una versione precedente, dovrai emularli: usa un INNER JOIN o una sottoquery con IN per replicare INTERSECT, e un LEFT JOIN ... WHERE IS NULL o una sottoquery NOT IN per replicare EXCEPT. Oracle usa MINUS invece di EXCEPT.


Kurtis Pykes 's photo
Author
Kurtis Pykes
LinkedIn
Argomenti

Scopri di più su SQL!

Programma

Ingegnere dei dati associato in SQL

30 h
Impara i fondamenti dell'ingegneria dei dati: progettazione di database e data warehousing, lavorando con tecnologie come PostgreSQL e Snowflake!
Vedi dettagliRight Arrow
Inizia il corso
Mostra altroRight Arrow
Correlato

blog

Che cos'è Snowflake? Guida per principianti alla piattaforma dati cloud

Esplora le basi di Snowflake, la piattaforma dati cloud. Scopri la sua architettura, le sue funzionalità e come integrarla nelle tue pipeline di dati.
Tim Lu's photo

Tim Lu

12 min

blog

Tokenizzazione nel NLP: come funziona, sfide e casi d'uso

Guida al preprocessing NLP nel machine learning. Copriamo spaCy, i transformer di Hugging Face e come funziona la tokenizzazione in casi d'uso reali.
Abid Ali Awan's photo

Abid Ali Awan

10 min

blog

I 15 migliori server MCP remoti che ogni AI builder dovrebbe conoscere nel 2026

Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Abid Ali Awan's photo

Abid Ali Awan

15 min

Mostra altroMostra altro