21st Jul 2022 Tempo di lettura: 8 minuti Cosa fanno le clausole SQL INTERSECT e MINUS? Andrew Bone sql imparare sql intersect minus Indice SQL INTERSECT SQL MENO MINUS vs. INTERSECT: Esempi Altri esempi di SQL INTERSECT e MINUS Una tabella è un sottoinsieme dei dati dell'altra tabella Entrambe le tabelle hanno gli stessi dati Una tabella non contiene dati INTERSECT, MINUS e altri operatori di set SQL 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: 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: 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. Tags: sql imparare sql intersect minus