# SQL EXISTS: verificare la presenza di determinati valori in una subquery

Con l’operatore SQL EXISTS puoi cercare una voce specifica all’interno di una subquery. Il risultato restituisce un valore booleano che è TRUE (vero) se la subquery restituisce almeno una riga. Inoltre, il comando EXISTS in SQL consente di verificare più condizioni.

## Cos’è SQL EXISTS?

Nello [Structured Query Language](https://www.ionos.it/digitalguide/server/know-how/che-cose-sql/), oltre alle normali query esistono le subquery, chiamate anche sottoquery. Se desideri verificare **la presenza di un determinato valore all’interno di una subquery**, puoi usare l’operatore SQL EXISTS. Così facendo applichi alla subquery una condizione definita che, se risulta soddisfatta, restituisce il valore `TRUE` (vero). Solo a questo punto viene eseguita anche la query esterna. SQL EXISTS può essere eseguito in combinazione con i [comandi SQL](https://www.ionos.it/digitalguide/server/configurazione/comandi-sql/) `DELETE`, `INSERT`, `SELECT` e `UPDATE`.

## Sintassi e funzionamento

Di seguito ti mostriamo il funzionamento di SQL EXISTS in combinazione con `SELECT`. Questa la sintassi:

```sql
SELECT nome_della/e_colonna/e
FROM nome_della_tabella
WHERE EXISTS
(SELECT nome_della_colonna FROM nome_della_tabella WHERE condizione);
```

`nome_della/e_colonna/e` indica la colonna o le colonne che dovranno essere filtrate con `SELECT`. Ora specifichiamo il nome della tabella per la quale verrà eseguito il comando. La verifica della subquery avviene in un secondo momento tramite la condizione `WHERE EXISTS`. Quindi inseriamo la subquery fra parentesi.

Quando il codice viene eseguito, prima si verifica la query esterna e solo successivamente la sottoquery. Se la sottoquery restituisce almeno un record (ovvero `TRUE`), il risultato della query esterna viene preso in considerazione. Tuttavia, se la sottoquery restituisce `NULL`, il risultato della query esterna verrà ignorato.

## Esempio di utilizzo dell’operatore

Per spiegare meglio come funziona SQL EXISTS e a cosa serve, di seguito facciamo un esempio. A questo proposito creiamo due tabelle diverse e chiamiamo la prima “Elenco clienti”. In questa tabella sono elencati i vari clienti di un’azienda con relativo numero cliente, cognome e città. La tabella si presenta così:

<table>
  <thead>
    <tr>
      <th>Numero cliente</th>
      <th>Cognome</th>
      <th>Città</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1427</td>
      <td>Rossi</td>
      <td>Roma</td>
    </tr>
    <tr>
      <td>1377</td>
      <td>Bianchi</td>
      <td>Milano</td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Ferrari</td>
      <td>Milano</td>
    </tr>
    <tr>
      <td>1431</td>
      <td>Costa</td>
      <td>Firenze</td>
    </tr>
    <tr>
      <td>1118</td>
      <td>Russo</td>
      <td>Napoli</td>
    </tr>
  </tbody>
</table>

La seconda tabella la chiameremo “Ordini”. Ogni voce della tabella contiene il numero articolo, il numero clienti e la data dell’ordine.

Questo l’aspetto della tabella:

<table>
  <thead>
    <tr>
      <th>Numero articolo</th>
      <th>Numero cliente</th>
      <th>Data dell’ordine</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>00282</td>
      <td>1172</td>
      <td>2024-01-17</td>
    </tr>
    <tr>
      <td>00311</td>
      <td>1361</td>
      <td>2024-01-19</td>
    </tr>
    <tr>
      <td>00106</td>
      <td>1431</td>
      <td>2024-01-19</td>
    </tr>
    <tr>
      <td>00378</td>
      <td>1274</td>
      <td>2024-01-30</td>
    </tr>
    <tr>
      <td>00418</td>
      <td>1118</td>
      <td>2024-02-03</td>
    </tr>
  </tbody>
</table>

Ora puoi cercare quali clienti hanno effettuato almeno un ordine nel periodo di tempo compreso fra il 17 gennaio e il 3 febbraio. Per farlo digiti questo codice:

```sql
SELECT Numero cliente, Cognome, Città
FROM Elenco clienti
WHERE EXISTS
(SELECT * FROM Ordini WHERE Elenco clienti.Numero cliente = Ordini.Numero cliente);
```

Ora il sistema verifica che i numeri cliente contenuti nella lista clienti siano presenti anche negli ordini. Se tale verifica restituisce il valore `TRUE`, allora vengono elencate le relative voci, cioè le informazioni correlate ai clienti che hanno effettuato un ordine. Di seguito la tabella:

<table>
  <thead>
    <tr>
      <th>Numero cliente</th>
      <th>Cognome</th>
      <th>Città</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1431</td>
      <td>Costa</td>
      <td>Firenze</td>
    </tr>
    <tr>
      <td>1118</td>
      <td>Russo</td>
      <td>Napoli</td>
    </tr>
  </tbody>
</table>

## Interrogare più condizioni

Per ottenere risultati più precisi, durante l’interrogazione puoi specificare **più criteri**. Nell’esempio qui sotto non vogliamo solo verificare se la tabella include determinati numeri cliente, ma anche se la città è Firenze. Il codice è il seguente:

```sql
SELECT Numero cliente, Cognome, Città
FROM Elenco clienti
WHERE EXISTS
(SELECT * FROM Ordini WHERE Elenco clienti.Numero cliente = Ordini.Numero cliente AND Città = 'Firenze');
```

Anche in questo caso il risultato è `TRUE` e l’output è il seguente:

<table>
  <thead>
    <tr>
      <th>Numero cliente</th>
      <th>Cognome</th>
      <th>Città</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1431</td>
      <td>Costa</td>
      <td>Firenze</td>
    </tr>
  </tbody>
</table>

## Combinazione con NOT

SQL EXISTS consente anche di effettuare l’operazione contraria, ad esempio cercare tutti i clienti che in un determinato periodo di tempo non hanno effettuato alcun ordine. Questo il codice, con l’**aggiunta** della clausola `NOT`.

```sql
SELECT Numero cliente, Cognome, Città
FROM Elenco clienti
WHERE NOT EXISTS
(SELECT * FROM Ordini WHERE Elenco clienti.Numero cliente = Ordini.Numero cliente);
```

Questo l’output:

<table>
  <thead>
    <tr>
      <th>Numero cliente</th>
      <th>Cognome</th>
      <th>Città</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1427</td>
      <td>Rossi</td>
      <td>Roma</td>
    </tr>
    <tr>
      <td>1377</td>
      <td>Bianchi</td>
      <td>Milano</td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Ferrari</td>
      <td>Milano</td>
    </tr>
  </tbody>
</table>

## Alcune alternative a SQL EXISTS

Esistono alcune alternative a SQL EXIST che ti consentono di filtrare determinate voci all’interno di una subquery. Le opzioni più pratiche sono gli operatori `IN` e `JOIN`, che potrai specificare in base alle tue esigenze.

Consiglio Massima performance e consulenza personalizzata. Grazie all’[hosting SQL server](https://www.ionos.it/cloud/sql-server-hosting "Hosting SQL server di IONOS") di IONOS puoi scegliere fra MSSQL, MySQL e MariaDB. Seleziona il database più adatto alle tue esigenze!


This is a markdown version of: [https://www.ionos.it/digitalguide/server/configurazione/sql-exists/](https://www.ionos.it/digitalguide/server/configurazione/sql-exists/) for AI/LLM consumption.