Vai al contenuto principale

Come usare l'operatore SQL EXISTS()

Scopri come usare l'operatore SQL EXISTS() per valutare e filtrare subquery, con esempi, best practice e consigli per ottimizzare le tue query.
Aggiornato 3 giu 2026  · 10 min leggi

L'operatore SQL EXISTS() verifica se un valore o un record è presente in una subquery. Quando incluso in una clausola WHERE(), l'operatore EXISTS() restituisce i record filtrati dalla query. La valutazione delle subquery è importante in SQL perché migliora le prestazioni delle query e consente di valutare query complesse.

Se aspiri a diventare data analyst o data scientist, ti consiglio il corso di DataCamp Introduction to SQL per imparare le basi del filtraggio dei dati in SQL. Per un rapido ripasso di operatori e funzioni SQL, dai un'occhiata al nostro Cheat Sheet SQL di base.

La risposta breve: come usare l'operatore SQL EXISTS()

L'operatore EXISTS() in SQL serve a verificare la presenza di record specifici in una subquery. In genere viene incluso in una clausola WHERE per filtrare i record, come nell'esempio qui sotto:

SELECT column_name(s)
FROM table_name
WHERE EXISTS (subquery);

Vediamo la sintassi della query sopra:

  • column_name(s): Le colonne da restituire
  • table_name: La tabella da cui selezioni i dati.
  • subquery: La subquery contiene un'istruzione SELECT annidata.

Supponiamo di avere le tabelle Products e Suppliers, come mostrato di seguito.

Esempio di tabella Products in SQL Server.

Esempio di tabella Products. Immagine dell'autore.

Esempio di tabella Suppliers in SQL Server.

Esempio di tabella Suppliers. Immagine dell'autore.

La query seguente usa l'operatore EXISTS() per filtrare i record in cui il fornitore ha dei prodotti e restituisce le righe filtrate.

-- Select all suppliers who have at least one product listed
SELECT supplier_name, city
FROM Suppliers s
WHERE EXISTS (
    -- Subquery to check if the supplier has any products
    SELECT 1
    FROM Products p
    WHERE p.supplier_id = s.supplier_id
);

La tabella risultante è mostrata qui sotto.

Esempio di tabella di output filtrata usando l'operatore SQL EXISTS.

Esempio di tabella di output. Immagine dell'autore.

Esempi dettagliati e casi d'uso

A livello più basilare, l'operatore EXISTS() in SQL verifica se qualche riga in una subquery soddisfa la condizione specificata, come abbiamo visto nell'esempio sopra. Ma possiamo anche usare l'operatore EXISTS() con condizioni più complesse. Guarda qui.

EXISTS() con condizioni più complesse

L'operatore EXISTS() può verificare più condizioni provenienti da tabelle diverse. Questa tecnica prevede l'uso di altri operatori per controllare la condizione specificata in una subquery. Nella query qui sotto, l'operatore EXISTS() verifica se un fornitore ha prodotti con prezzo superiore a $5,00. Nota che la query include l'operatore AND nelle condizioni complesse.

-- Select all suppliers who have products priced above $5.00
SELECT supplier_name, city
FROM Suppliers s
WHERE EXISTS (
    -- Subquery to check if the supplier has any products priced above $5.00
    SELECT 1
    FROM Products p
    WHERE p.supplier_id = s.supplier_id
    AND p.price > 5.00
);

Esempio di output di dati filtrati usando SQL EXISTS con condizioni complesse.

Esempio di tabella di output con condizioni complesse. Immagine dell'autore.

Operatore NOT EXISTS()

L'operatore NOT EXISTS() è l'opposto di EXISTS() e si usa per trovare i record non corrispondenti in una subquery. Per esempio, la query qui sotto filtra i dati e restituisce le righe dalla tabella Suppliers in cui il fornitore non ha prodotti corrispondenti nella tabella Products.

-- Select all suppliers who do not have any products listed
SELECT supplier_name, city
FROM Suppliers s
WHERE NOT EXISTS (
    -- Subquery to check if the supplier does not have any products
    SELECT 1
    FROM Products p
    WHERE p.supplier_id = s.supplier_id
);

Tecniche avanzate dell'operatore SQL EXISTS()

Esistono anche modi avanzati per usare l'operatore EXISTS(), tra cui i seguenti:

EXISTS() con subquery correlate

L'operatore EXISTS() valuta i record riga per riga nelle subquery correlate. La query seguente usa EXISTS() e subquery correlate per filtrare i record e trovare i prodotti con fornitori situati nella stessa città.

-- Select all products where the supplier is located in the same city as the product's supplier
SELECT product_name, price
FROM Products p1
WHERE EXISTS (
    -- Correlated subquery to check if there is another product with the same supplier's city
    SELECT 1
    FROM Suppliers s1
    WHERE s1.supplier_id = p1.supplier_id
    AND EXISTS (
        -- Nested correlated subquery to ensure the city matches
        SELECT 1
        FROM Suppliers s2
        WHERE s2.city = s1.city
        AND s2.supplier_id <> s1.supplier_id
    )
);

Combinare EXISTS() con altri operatori

L'operatore EXISTS() è una tecnica di query avanzata che può essere combinata con altri operatori come IN, ANY e ALL per filtraggi complessi. La query qui sotto usa questo metodo per trovare i fornitori i cui prodotti hanno un prezzo inferiore a quelli di John.

-- Select suppliers who have products priced lower than any product supplied by 'John'
SELECT supplier_name, city
FROM Suppliers s
WHERE EXISTS (
    -- Subquery to find products priced lower than any product by 'John'
    SELECT 1
    FROM Products p1
    WHERE p1.supplier_id = s.supplier_id
    AND p1.price < ANY (
        -- Subquery to get the prices of products supplied by 'John'
        SELECT p2.price
        FROM Products p2
        JOIN Suppliers s2 ON p2.supplier_id = s2.supplier_id
        WHERE s2.supplier_name = 'John'
    )
);

Esempio di output di dati filtrati usando SQL EXISTS con altri operatori.

Esempio di output usando EXISTS() con altri operatori. Immagine dell'autore.

Ottimizzare EXISTS() per le prestazioni

Le diverse tecniche per ottimizzare le prestazioni dell'operatore EXISTS() includono:

Indicizzazione

Indicizzare le colonne rilevanti velocizza l'esecuzione delle query, migliorando le prestazioni.

-- Create index on supplier_id in Products table
CREATE INDEX idx_supplier_id ON Products(supplier_id);
-- Create index on city in Suppliers table
CREATE INDEX idx_city ON Suppliers(city);

Uso di SELECT 1

La subquery SELECT 1 nell'operatore EXISTS() migliora la leggibilità e le prestazioni della query.

-- Example using SELECT 1 in subquery
SELECT supplier_name, city
FROM Suppliers s
WHERE EXISTS (
    SELECT 1
    FROM Products p
    WHERE p.supplier_id = s.supplier_id
);

Limitare l'esecuzione della subquery

Un modo per ottimizzare le prestazioni di EXISTS() è limitare il numero di righe restituite da una query. La query qui sotto limita i record recuperando le righe in cui il prezzo del prodotto supera $5,00.

-- Optimized subquery to minimize data retrieval
SELECT supplier_name, city
FROM Suppliers s
WHERE EXISTS (
    SELECT 1
    FROM Products p
    WHERE p.supplier_id = s.supplier_id
	-- Limit records to retrieve where price > $5.00
    AND p.price > 5.00 
);

Applicazioni pratiche dell'operatore SQL EXISTS()

Ci sono diverse applicazioni dell'operatore EXISTS() nell'analisi dei dati, tra cui:

  • Validazione dei dati: L'operatore EXISTS() in SQL verifica la presenza di dati correlati prima di eseguire ulteriori operazioni.
  • Filtraggio dei risultati: L'operatore EXISTS() filtra i risultati in base a subquery per restituire i record richiesti.
  • Garantire l'integrità dei dati: L'operatore EXISTS() controlla se un determinato record è presente in un dataset/tabella prima di inserirlo o aggiornarlo.
  • Aggiornamenti condizionali: L'operatore EXISTS() può essere usato per aggiornare i record in una tabella in base all'esistenza di altri record.
  • Eliminazione di record: L'operatore EXISTS() può verificare ed eliminare record in una tabella.
  • Ottimizzazione delle subquery: Quando incluso in subquery correlate, l'operatore EXISTS() in SQL è usato per l'ottimizzazione delle subquery.

Ti consiglio i corsi di DataCamp Associate Data Analyst in SQL e Reporting in SQL per approfondire le applicazioni pratiche di SQL attraverso l'analisi dei dati.

Implementazioni e considerazioni specifiche per database

Quando usi l'operatore EXISTS(), è importante considerare il supporto e la sintassi delle query nei diversi database.

Differenze tra dialetti SQL.

L'operatore EXISTS() è uniforme tra i database MySQL, PostgreSQL, Oracle e SQL Server. Quindi, se migri il codice da un database a un altro, non dovresti dover modificare questa parte del codice. 

Nota che l'operatore EXISTS() in SQL Server rientra in Transact-SQL (T-SQL). T-SQL è un linguaggio di query con funzionalità avanzate usato principalmente nel database SQL Server. Tuttavia, la sintassi dell'operatore EXISTS() resta simile agli esempi mostrati in questo tutorial.

Funzioni alternative all'operatore EXISTS()

Se cerchi alternative, le seguenti funzioni aiutano a filtrare i dati in modo simile a EXISTS().

Operatore IN

L'operatore IN verifica l'esistenza dei record proprio come EXISTS(). Tuttavia, l'operatore IN può avere problemi di prestazioni perché interroga l'intero dataset in una volta sola.

-- Using IN to check if suppliers have products
SELECT supplier_name, city
FROM Suppliers
WHERE supplier_id IN (
    SELECT supplier_id
    FROM Products
);

Clausola JOIN

La clausola JOIN è efficace per verificare l'esistenza di record in dati correlati ma è meno efficiente dell'operatore EXISTS(). EXISTS() è più efficiente perché si limita a controllare se una subquery restituisce righe senza unire i dataset, come invece fa JOIN.

-- Using JOIN to check if suppliers have products
SELECT s.supplier_name, s.city
FROM Suppliers s
JOIN Products p ON s.supplier_id = p.supplier_id
GROUP BY s.supplier_name, s.city;

Per saperne di più sulle join tra tabelle, dai un'occhiata al corso di DataCamp Learn SQL, che tratta l'argomento in dettaglio.

Considerazioni sulle prestazioni e best practice

In alcuni casi, usare l'operatore EXISTS() può causare problemi di prestazioni. Per ottimizzarle, considera le seguenti pratiche.

Impatto sulle prestazioni delle query e strategie per ottimizzarne l'uso

Le query SQL che usano l'operatore EXISTS() possono avere problemi di prestazioni con dataset o risultati delle subquery molto grandi. È quindi importante applicare diversi filtri nella subquery per ridurre al minimo il numero di record da recuperare. Il metodo più efficace è usare l'istruzione SELECT 1 per ridurre la quantità di dati elaborati durante il filtraggio.

-- Efficient subquery with selective filtering
SELECT supplier_name, city
FROM Suppliers s
WHERE EXISTS (
    SELECT 1
    FROM Products p
    WHERE p.supplier_id = s.supplier_id
    AND p.price > 5.00
);

Considerazioni sull'indicizzazione per garantire una valutazione efficiente delle subquery

Per migliorare le prestazioni delle subquery, indicizza le colonne usate di frequente nella clausola WHERE. La tecnica migliore è creare indici sulle colonne coinvolte nelle condizioni di join e nei filtri della subquery.

-- Create an index on the supplier_id column in the Products table
CREATE INDEX idx_supplier_id ON Products(supplier_id);
-- Create an index on the supplier_id column in the Suppliers table
CREATE INDEX idx_supplier_id_suppliers ON Suppliers(supplier_id);

Monitorare e risolvere i colli di bottiglia delle prestazioni

Per monitorare i colli di bottiglia, usa i piani di esecuzione per identificare grandi cicli annidati che ostacolano l'esecuzione delle query. Strumenti di gestione del database come EXPLAIN in SQL Server e MySQL aiutano a comprendere il piano di esecuzione prima di ottimizzare la query.

-- Using EXPLAIN to analyze the execution plan
EXPLAIN
SELECT supplier_name, city
FROM Suppliers s
WHERE EXISTS (
    SELECT 1
    FROM Products p
    WHERE p.supplier_id = s.supplier_id
);

Anche l'uso dell'elaborazione in batch e il refactoring delle query aiuta a suddividere query grandi in parti più piccole per un'elaborazione più rapida. L'elaborazione in batch consente di filtrare grandi dataset a blocchi, migliorando i tempi di esecuzione.

-- Refactoring a complex query into simpler parts
WITH SupplierProducts AS (
    SELECT supplier_id
    FROM Products
    WHERE price > 5.00
)
SELECT supplier_name, city
FROM Suppliers s
WHERE EXISTS (
    SELECT 1
    FROM SupplierProducts sp
    WHERE sp.supplier_id = s.supplier_id
);

Anche gli strumenti di profilazione delle query integrati aiutano a monitorare e risolvere i colli di bottiglia. Questi strumenti includono:

Conclusione e approfondimenti

Come abbiamo visto, l'operatore SQL EXISTS() è utile per verificare l'esistenza di record/valori in una subquery. Imparare a usare EXISTS() è importante nella gestione e nell'analisi dei database. 

Ti invito a esercitarti con i diversi casi d'uso di EXISTS() su dataset differenti per padroneggiarne l'utilizzo e comprenderne le sfumature. Se vuoi far progredire le tue competenze in SQL, ti consiglio i corsi di DataCamp SQL Fundamentals e Intermediate SQL. Dovresti anche ottenere la nostra Certificazione SQL Associate per dimostrare la tua applicazione pratica di SQL, che sicuramente ti aiuterà a distinguerti durante i colloqui.


Allan Ouko's photo
Author
Allan Ouko
LinkedIn
Technical writer di Data Science con esperienza pratica in data analytics, business intelligence e data science. Scrivo contenuti pratici e orientati al settore su SQL, Python, Power BI, Databricks e data engineering, basati su lavoro di analytics reale. La mia scrittura unisce profondità tecnica e impatto sul business, aiutando i professionisti a trasformare i dati in decisioni sicure.

Domande frequenti

Che cos'è l'operatore SQL EXISTS?

L'operatore EXISTS() in SQL si usa per verificare l'esistenza di un record o di un valore in una subquery.

Che cos'è l'operatore SQL NOT EXISTS?

L'operatore SQL NOT EXISTS() filtra i record in una tabella e restituisce le righe che non soddisfano la condizione specificata nella subquery.

Posso usare l'operatore SQL EXISTS per verificare più condizioni?

L'operatore EXISTS() in SQL può verificare più condizioni quando è combinato con altri operatori come AND.

L'operatore SQL EXISTS è supportato in tutti i database?

Tutti i principali database, tra cui MySQL, SQL Server, PostgreSQL e Oracle, supportano l'operatore EXISTS().

Quali funzioni/clausole sono alternative all'operatore SQL EXISTS?

L'operatore IN e la clausola JOIN sono alternative appropriate all'operatore EXISTS(). Tuttavia, queste alternative possono presentare problemi di prestazioni nella query.

Si può usare EXISTS() in combinazione con clausole diverse da WHERE?

Sì, EXISTS() può essere usato anche con la clausola HAVING.

Argomenti

Impara SQL con DataCamp

Corso

SQL Server intermedio

4 h
65.6K
In questo corso userai T-SQL, il tipo di SQL che si usa in SQL Server di Microsoft per analizzare i dati.
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