# SQL EXISTS: Verificar subconsultas para valores específicos

Com o operador SQL EXISTS, você pode verificar se uma subconsulta contém um valor específico. O resultado é um valor booleano. Também é possível consultar várias condições.

## O que é SQL EXISTS?

Em [SQL (*Structured Query Language*)](https://www.ionos.com/pt-br/digitalguide/servidor/conhecimento/o-que-e-sql/), além das consultas regulares, existe o conceito de “subconsultas” ou *subqueries*. Se você quiser verificar se um **valor específico está presente em uma dessas subconsultas**, você pode usar o operador SQL EXISTS. Este operador aplica uma condição definida à subconsulta e retorna o valor `TRUE` (ou seja, “verdadeiro”) se a condição for satisfeita. Somente se essa condição for atendida, a consulta principal será executada. O operador SQL EXISTS pode ser utilizado com os comandos SQL `DELETE`, `INSERT`, `SELECT` e `UPDATE`.

## Sintaxe e funcionamento de SQL EXISTS

A seguir, mostramos como o operador SQL EXISTS funciona em combinação com `SELECT`. A sintaxe correspondente é a seguinte:

```sql
SELECT nome_da_coluna(s)
FROM nome_da_tabela
WHERE EXISTS
(SELECT nome_da_coluna FROM nome_da_tabela WHERE condição);
```

`nome_da_coluna(s)` refere-se à coluna ou colunas que devem ser filtradas pelo `SELECT`. Em seguida, você deve especificar o nome da tabela onde o comando será executado. A verificação da subconsulta é feita por meio de `WHERE EXISTS`. Neste ponto, você fornece a subconsulta correspondente entre parênteses.

Ao executar o código, a consulta principal é iniciada. Então, o sistema executa a subconsulta. Se a subconsulta retornar um resultado (ou seja, `TRUE`), o resultado da consulta principal será considerado. Se o resultado da subconsulta for `NULL`, o resultado da consulta principal também será ignorado.

## Exemplo de aplicação de SQL EXISTS

A importância e o funcionamento do SQL EXISTS podem ser melhor compreendidos com um exemplo. Para isso, criamos duas tabelas diferentes. A primeira tabela é chamada “Lista de Clientes”. Nela estão listados vários clientes de uma empresa, com número de cliente, nome e localização. Esta tabela é como segue:

<table>
  <thead>
    <tr>
      <th>Número do Cliente</th>
      <th>Nome</th>
      <th>Localização</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1427</td>
      <td>Machado</td>
      <td>Rio de Janeiro</td>
    </tr>
    <tr>
      <td>1377</td>
      <td>Silva</td>
      <td>Curitiba</td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Recife</td>
      <td>Curitiba</td>
    </tr>
    <tr>
      <td>1431</td>
      <td>Ribeiro</td>
      <td>Luziânia</td>
    </tr>
    <tr>
      <td>1118</td>
      <td>Becker</td>
      <td>Palmas</td>
    </tr>
  </tbody>
</table>

Nossa segunda tabela é chamada de “Pedidos”. Ela contém para cada entrada um número de item, o número do cliente e a data do pedido. Ela é estruturada da seguinte forma:

<table>
  <thead>
    <tr>
      <th>Número do Item</th>
      <th>Número do Cliente</th>
      <th>Data do Pedido</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>

Agora, podemos filtrar quais clientes fizeram pelo menos um pedido no período de 17 de janeiro a 3 de fevereiro. Para isso, utilizamos o seguinte código:

```sql
SELECT Número do Cliente, Nome, Localização
FROM Lista de Clientes
WHERE EXISTS
(SELECT * FROM Pedidos WHERE Clientes.Número do Cliente = Pedidos.Número do Cliente);
```

O sistema verifica se os números dos clientes da tabela “Lista de Clientes” também aparecem na tabela “Pedidos”. Se isso acontecer (ou seja, o valor é `TRUE`), os registros correspondentes são listados. A tabela resultante ficará assim:

<table>
  <thead>
    <tr>
      <th>Número do Cliente</th>
      <th>Nome</th>
      <th>Localização</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1431</td>
      <td>Ribeiro</td>
      <td>Luziânia</td>
    </tr>
    <tr>
      <td>1118</td>
      <td>Becker</td>
      <td>Palmas</td>
    </tr>
  </tbody>
</table>

## Consultar várias condições com SQL EXISTS

Você também tem a possibilidade de **consultar várias condições** e, assim, especificar ainda mais sua seleção. No exemplo a seguir, queremos verificar se não apenas certos números de cliente estão presentes, mas também se a localização é Luziânia. O código fica assim:

```sql
SELECT Número do Cliente, Nome, Localização
FROM Lista de Clientes
WHERE EXISTS
(SELECT * FROM Pedidos WHERE Clientes.Número do Cliente = Pedidos.Número do Cliente AND Localização = 'Luziânia');
```

Aqui o resultado também é `TRUE` e a saída é a seguinte:

<table>
  <thead>
    <tr>
      <th>Número do Cliente</th>
      <th>Nome</th>
      <th>Localização</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1431</td>
      <td>Ribeiro</td>
      <td>Luziânia</td>
    </tr>
  </tbody>
</table>

## Combinar SQL EXISTS e NOT

Se você quiser seguir o caminho inverso, o SQL EXISTS também oferece essa opção. No exemplo a seguir, buscamos todos os clientes que *não* fizeram nenhum pedido no período correspondente. Para isso, adicionamos o **complemento** `NOT`.

```sql
SELECT Número do Cliente, Nome, Localização
FROM Lista de Clientes
WHERE NOT EXISTS
(SELECT * FROM Pedidos WHERE Clientes.Número do Cliente = Pedidos.Número do Cliente);
```

A saída será:

<table>
  <thead>
    <tr>
      <th>Número do Cliente</th>
      <th>Nome</th>
      <th>Localização</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1427</td>
      <td>Machado</td>
      <td>Rio de Janeiro</td>
    </tr>
    <tr>
      <td>1377</td>
      <td>Silva</td>
      <td>Curitiba</td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Recife</td>
      <td>Curitiba</td>
    </tr>
  </tbody>
</table>

## Alternativas ao SQL EXISTS

Existem algumas alternativas ao SQL EXISTS que também permitem investigar subconsultas em busca de entradas específicas. As opções mais práticas são os operadores `IN` e `JOIN`, que você também pode especificar de acordo com suas necessidades.

Dica Desempenho de alta qualidade e consultoria personalizada! Com [SQL Server Hosting](https://www.ionos.com/cloud/sql-server-hosting "SQL Server Hosting — IONOS") da IONOS, você pode escolher entre MSSQL, MySQL e MariaDB. Escolha o modelo que melhor se adapta às suas necessidades!


This is a markdown version of: [https://www.ionos.com/pt-br/digitalguide/servidor/configuracao/sql-exists/](https://www.ionos.com/pt-br/digitalguide/servidor/configuracao/sql-exists/) for AI/LLM consumption.