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

Cosa fanno le clausole SQL INTERSECT e MINUS?

Conoscete la differenza tra le clausole INTERSECT e MINUS di SQL e come utilizzarle? In questo articolo troverete esempi e spiegazioni.

SQL INTERSECT e MINUS sono clausole utili per individuare rapidamente la differenza tra due tabelle e trovare le righe che condividono.

INTERSECT confronta i dati tra le tabelle e restituisce solo le righe di dati presenti in entrambe le tabelle.

MINUS confronta i dati tra le tabelle e restituisce le righe di dati presenti solo nella prima tabella specificata.

Sia SQL INTERSECT che MINUS (o EXCEPT, a seconda del vostro dialetto SQL) fanno parte del corso SQL Basics di LearnSQL.it.

SQL INTERSECT

L'operatore SQL INTERSECT viene utilizzato per restituire i risultati di due o più istruzioni SELECT. Tuttavia, restituisce solo le righe selezionate da tutte le query o i set di dati. Se un record esiste in una query e non nell'altra, verrà omesso dai risultati INTERSECT.

Il numero e l'ordine delle colonne devono essere gli stessi in tutte le query SELECT.

I tipi di dati delle colonne devono essere gli stessi, o almeno compatibili tra loro. INTERSECT filtra i duplicati e restituisce solo le righe distinte che sono comuni a tutte le query.

Ecco la sintassi dell'operatore INTERSECT:

SELECT column_1 [, column_2, …, column_n]
FROM table_1 [, table_2, …, table_n]
[WHERE condition]

INTERSECT

SELECT column_1 [, column_2, …, column_n]
FROM table_1 [, table_2, …, table_n]
[WHERE condition]

Tutto ciò che si trova all'interno delle parentesi quadre è del tutto facoltativo. Il concetto di INTERSECT è ulteriormente spiegato dal seguente diagramma:

INTERSETTO

La query INTERSECT restituisce i record nell'area ombreggiata. Si tratta dei record presenti in entrambi i set di dati.

INTERSECT è solo un modo per unire i risultati di diverse query SQL. Se siete interessati a saperne di più, questo articolo illustra i diversi metodi per combinare i risultati delle query SQL.

SQL MENO

La clausola SQL MINUS viene usata per combinare due istruzioni SELECT, ma restituisce le righe della prima istruzione SELECT che non sono restituite dalla seconda istruzione SELECT. SQL MINUS restituisce solo le righe che non sono disponibili nella seconda istruzione SELECT.

Ogni istruzione SELECT all'interno di una query MINUS deve contenere lo stesso numero di campi nei set di risultati e tipi di dati simili.

L'operatore MINUS non è supportato in tutti i database SQL. Può essere utilizzato in database come MySQL e Oracle. Per database come SQL Server, PostgreSQL e SQLite, utilizzare l'operatore EXCEPT per eseguire questo tipo di query.

SELECT column_1 [, column_2, …, column_n]
FROM table_1 [, table_2, …, table_n]
[WHERE condition]

MINUS

SELECT column_1 [, column_2, …, column_n]
FROM table_1 [, table_2, …, table_n]
[WHERE condition]

Il codice SQL indicato tra le parentesi quadre è del tutto facoltativo. Il concetto di SQL MINUS è ulteriormente spiegato da questo diagramma:

MENO

La query MINUS restituisce i record nell'area rossa. Questi sono i record che esistono nel primo set di dati e non nel secondo.

MINUS vs. INTERSECT: Esempi

Applichiamo le clausole INTERSECT e MINUS a un esempio pratico. Immaginiamo di avere le seguenti tabelle.

customers - Contiene dettagli sui nostri clienti

idcustomer_namecountry
1Infotech SolutionsGermany
2Corpway IndustriesIreland
3Fenway IncEngland
4Fairview LtdFrance

suppliers - Contiene informazioni sui nostri fornitori.

idcustomer_namecountry
1Carbon Way SuppliersSpain
2Alloy IncFrance
3Materials Delivered LtdIreland
4Concrete CrewPoland
5Conglorito SystemsItaly

Ora scriviamo una query INTERSECT. Vogliamo trovare i Paesi che i nostri fornitori e clienti hanno in comune.

SELECT country
FROM customers
INTERSECT
SELECT country
FROM suppliers

Specifichiamo la colonna Paese in ogni clausola SELECT. L'esecuzione di questa query produce il seguente set di dati:

country
France
Ireland

Guardando indietro nel tempo customers e suppliers si può notare che il risultato è corretto. Solo i paesi di Francia e Irlanda sono condivisi tra le tabelle.

Ora applichiamo l'operatore MINUS alle stesse tabelle. Questo ci permetterà di ottenere i paesi nella nostra tabella customers che non sono presenti nella nostra tabella suppliers tabella:

SELECT country
FROM customers
MINUS
SELECT country
FROM suppliers

L'esecuzione di questa query produce il risultato:

country
England
Germany

Ecco i paesi che sono unici per la nostra tabella. customers tabella. L'ordine delle clausole SELECT è molto importante e va tenuto presente quando si usa l'operatore MINUS. Invertiamo l'ordine delle clausole SELECT e vediamo cosa succede.

SELECT country
FROM suppliers
EXCEPT
SELECT country
FROM customers

L'esecuzione di questa query produce i seguenti dati:

country
Italy
Poland
Spain

Come si può vedere, l'insieme dei risultati è molto diverso. SQL inizia con la tabella suppliers e poi rimuove tutti i paesi che esistono nella tabella customers tabella.

Se vi sentite sopraffatti, provate il percorso SQL Fundamentals di LearnSQL.com, che vi fornirà una solida base di SQL. Vi insegnerà le istruzioni SQL di base come WHERE, GROUP BY, ORDER BY e HAVING. Imparerete anche come JOIN tabelle e come aggiungere, modificare o rimuovere dati da un database.

Questo era un semplice esempio che mostrava come gli operatori INTERSECT e MINUS possono essere utilizzati per recuperare rapidamente insiemi di dati distinti. Vediamo altri esempi che mostrano come questi operatori agiscono in tre diversi scenari:

  • Una tabella è il sottoinsieme dei dati dell'altra tabella.
  • Entrambe le tabelle hanno gli stessi dati.
  • Una tabella della query non contiene dati.

Altri esempi di SQL INTERSECT e MINUS

Una tabella è un sottoinsieme dei dati dell'altra tabella

Per questo scenario, immaginiamo di avere due tabelle chiamate employees e planning_committee. Come si può notare, la tabella planning_committee è un sottoinsieme di employees, cioè tutti i suoi dati sono contenuti anche in employees.

employees - Tutti i dipendenti della nostra azienda.

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

planning_committee - Tutti i dipendenti del comitato di pianificazione della nostra azienda.

employee_idfirst_namelast_name
415938JaneRamsey
783273AndrewJohnson

Vediamo come si comporta la clausola INTERSECT in questo scenario.

SELECT employee_id, first_name, last_name
FROM employees
INTERSECT
SELECT employee_id, first_name, last_name
FROM planning_committee

Viene restituito il seguente set di dati:

employee_idfirst_namelast_name
415938JaneRamsey
783273AndrewJohnson

Come si può notare, viene restituito solo il sottoinsieme. Questo perché la tabella planning_committee è un sottoinsieme della tabella employees quindi il risultato sarà semplicemente la tabella planning_committee tabella.

Cosa succede se invece utilizziamo la clausola MINUS? Immaginiamo di voler trovare tutti i dipendenti che non fanno parte del comitato di pianificazione. Questo si può ottenere scrivendo la query seguente:

SELECT employee_id, first_name, last_name
FROM employees
MINUS
SELECT employee_id, first_name, last_name
FROM planning_committee

L'esecuzione di questa query produce il seguente risultato:

employee_idfirst_namelast_name
321873JohnSmith
832923ChristinaGrey

Si può notare che questi dipendenti non sono presenti nella tabella. planning_committee e questo è il risultato desiderato! Anche in questo caso, l'ordine delle tabelle è importante. Se invertissimo l'ordine delle clausole di SELECT in questo modo...

SELECT employee_id, first_name, last_name
FROM planning_committee
EXCEPT
SELECT employee_id, first_name, last_name
FROM employees

... l'esecuzione di questa query darebbe un risultato molto diverso:

employee_idfirst_namelast_name

Poiché tutti i dati della tabella planning_committee sono contenuti nella tabella employees non viene restituito nulla. SQL MINUS restituisce solo dati distinti.

È ora di esaminare il prossimo scenario.

Entrambe le tabelle hanno gli stessi dati

Può capitare che due tabelle SQL abbiano dati identici. Come si comportano le clausole INTERSECT e MINUS in questa situazione e quali risultati ci si deve aspettare? Scopriamolo!

Per questo scenario, utilizzeremo le seguenti tabelle:

payroll - Tutti i dipendenti attualmente sul libro paga della nostra azienda.

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

employees - Tutti i dipendenti della nostra azienda.

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

Si può notare che tutti i dipendenti della nostra azienda sono attualmente sul libro paga e vengono pagati come dovrebbero. Le tabelle contengono quindi dati identici.

Vediamo come la clausola INTERSECT gestisce questo caso:

SELECT employee_id, first_name, last_name
FROM employees
INTERSECT
SELECT employee_id, first_name, last_name
FROM payroll

L'esecuzione della query restituisce questo risultato:

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

Poiché tutti i dati sono stati condivisi tra le due tabelle, tutto viene restituito!

Vediamo come la clausola MINUS gestisce le tabelle che condividono dati identici:

SELECT employee_id, first_name, last_name
FROM employees
MINUS
SELECT employee_id, first_name, last_name
FROM payroll

L'esecuzione di questa query mostra il seguente risultato:

employee_idfirst_namelast_name

Non viene restituito alcun dato! SQL inizia selezionando i dati della nostra tabella employees tabella e poi sottrae i dati esistenti nella tabella. payroll tabella. In questo caso, tutto viene rimosso.

Questo porta al nostro scenario finale. Cosa succede se una delle tabelle che fanno parte di una clausola INTERSECT o MINUS non contiene dati?

Una tabella non contiene dati

Per questo scenario, utilizzeremo le seguenti tabelle:

employees - Tutti i dipendenti della nostra azienda.

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

on_vacation - Tutti i dipendenti della nostra azienda attualmente in ferie.

employee_idfirst_namelast_name

Scopriamo come la clausola INTERSECT gestisce una tabella vuota:

SELECT employee_id, first_name, last_name
FROM employees
INTERSECT
SELECT employee_id, first_name, last_name
FROM on_vacation

Dopo l'esecuzione della query si ottiene il seguente risultato:

employee_idfirst_namelast_name

Nessun risultato! Quando si utilizza una tabella vuota come parte della clausola INTERSECT, si ottiene un set di dati vuoto. Questo perché non è stato possibile trovare alcuna corrispondenza tra le due tabelle.

Il modo in cui la clausola MINUS viene influenzata dall'inclusione di una tabella vuota dipende interamente dall'ordine specificato. Ad esempio, questa query ...

SELECT employee_id, first_name, last_name
FROM employees
MINUS
SELECT employee_id, first_name, last_name
FROM on_vacation

... produce il seguente risultato:

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

La clausola MINUS in questo caso ha un effetto minimo, in quanto essenzialmente non si sta togliendo nulla (un insieme di dati vuoto) dalla tabella. employees dalla tabella.

Tuttavia, se si inverte l'ordine delle clausole SELECT, in questo modo ...

SELECT employee_id, first_name, last_name
FROM on_vacation
MINUS
SELECT employee_id, first_name, last_name
FROM employees

... ci troveremmo di fronte a un risultato molto diverso:

employee_idfirst_namelast_name
Smith

Un altro insieme di dati vuoto! Questo accade perché la prima clausola SELECT recupera i dati dalla tabella, che in questo caso non sono nulla. on_vacation che in questo caso è nulla. Quindi, si istruisce SQL a prelevare i dati employees dal nostro insieme di dati vuoto. Questo non ha alcun effetto, perché l'insieme di dati è già vuoto!

INTERSECT, MINUS e altri operatori di set SQL

In questo articolo abbiamo trattato in dettaglio gli operatori SQL INTERSECT e MINUS. Si tratta dei cosiddetti operatori di insieme SQL, che comprendono anche UNION e UNION ALL. Qui potete leggere un'introduzione agli operatori di insieme SQL e come raffinare ulteriormente i risultati con gli operatori di insieme.