# SQL HAVING: Como filtrar resultados com funções agregadas

SQL HAVING é uma condição que pode ser aplicada a entradas já agrupadas. Ela funciona com funções agregadas e é utilizada para restringir o conjunto de resultados.

## O que é SQL HAVING?

Além da conhecida cláusula WHERE, existe em [SQL (*Structured Query Language*)](https://www.ionos.com/pt-br/digitalguide/servidor/conhecimento/o-que-e-sql/) outra condição amplamente utilizada: SQL HAVING. Esta cláusula foi introduzida para filtrar dados com base em critérios específicos. Ela é usada com o comando SQL `SELECT` e a instrução [SQL GROUP BY](https://www.ionos.com/pt-br/digitalguide/servidor/configuracao/sql-having/). Enquanto o GROUP BY agrupa os resultados, a cláusula SQL HAVING restringe esse conjunto de resultados **com a ajuda de diferentes funções agregadas**. A cláusula HAVING foi criada porque WHERE não interage com funções agregadas como [SQL AVG()](https://www.ionos.com/pt-br/digitalguide/servidor/configuracao/sql-avg/), [SQL COUNT()](https://www.ionos.com/pt-br/digitalguide/servidor/configuracao/sql-count/), `MAX()`, `MIN()` e `SUM()`. SQL HAVING é usada após instruções `WHERE` (se existirem) e `GROUP BY`, mas antes de `ORDER BY`.

## Sintaxe e funcionamento de SQL HAVING

Para entender o funcionamento e a utilidade do SQL HAVING, vale a pena observar a sintaxe da cláusula. Ela é a seguinte:

```sql
SELECT nome_da_coluna(s)
FROM nome_da_tabela
WHERE condição
GROUP BY nome_da_coluna(s)
HAVING condição
ORDER BY nome_da_coluna(s);
```

Normalmente, uma função agregada é aplicada a uma ou mais colunas. Em seguida, o nome da tabela é especificado. A condição `WHERE` **é opcional**. `GROUP BY` agrupa valores idênticos em grupos, que são então filtrados de forma mais precisa com `HAVING` e ordenados com `ORDER BY`.

## Exemplo de aplicação de SQL HAVING

A maneira mais simples de ilustrar a cláusula SQL HAVING é com um exemplo prático. Vamos criar uma pequena tabela chamada “Lista de Clientes”. Ela contém as colunas “Número do Cliente”, “Nome”, “Localização” e “Itens”.

<table>
  <thead>
    <tr>
      <th>Número do Cliente</th>
      <th>Nome</th>
      <th>Localização</th>
      <th>Itens</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1427</td>
      <td>Schmidt</td>
      <td>Goiânia</td>
      <td>13</td>
    </tr>
    <tr>
      <td>1377</td>
      <td>Marques</td>
      <td>Vitória</td>
      <td>9</td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Pedroso</td>
      <td>Vitória</td>
      <td>15</td>
    </tr>
    <tr>
      <td>1431</td>
      <td>Nunes</td>
      <td>Fortaleza</td>
      <td>22</td>
    </tr>
    <tr>
      <td>1118</td>
      <td>Becker</td>
      <td>Goiânia</td>
      <td>10</td>
    </tr>
  </tbody>
</table>

Agora utilizamos SQL HAVING para descobrir quantos clientes de Vitória fizeram pedidos de dez ou mais itens. Usamos o seguinte código e indicamos a quantidade com um [alias em SQL](https://www.ionos.com/pt-br/digitalguide/servidor/configuracao/sql-aliases/) chamado “Número de Pedidos”:

```sql
SELECT Localização, COUNT(Localização) AS Número de Pedidos
FROM Lista de Clientes
WHERE Localização = 'Vitória'
GROUP BY Localização, Itens
HAVING COUNT(Itens) > 10;
```

A saída correspondente é a seguinte:

<table>
  <thead>
    <tr>
      <th>Localização</th>
      <th>Número de Pedidos</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Vitória</td>
      <td>1</td>
    </tr>
  </tbody>
</table>

## Combinar SQL HAVING e INNER JOIN

Você também pode combinar SQL HAVING com a palavra-chave `INNER JOIN`. Para isso, criamos uma segunda tabela chamada “Item\_01”, onde é registrado com que frequência e quando um determinado item foi pedido. Ela contém um número do pedido, um número de cliente, a quantidade e uma data de pedido e é exibida da seguinte forma:

<table>
  <thead>
    <tr>
      <th>Número do Pedido</th>
      <th>Número do Cliente</th>
      <th>Quantidade</th>
      <th>Data</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>00283</td>
      <td>1427</td>
      <td>4</td>
      <td>2024-01-15</td>
    </tr>
    <tr>
      <td>00284</td>
      <td>1211</td>
      <td>7</td>
      <td>2024-01-19</td>
    </tr>
    <tr>
      <td>00285</td>
      <td>1275</td>
      <td>15</td>
      <td>2024-01-29</td>
    </tr>
    <tr>
      <td>00286</td>
      <td>1431</td>
      <td>10</td>
      <td>2024-02-01</td>
    </tr>
    <tr>
      <td>00287</td>
      <td>1427</td>
      <td>9</td>
      <td>2024-02-05</td>
    </tr>
  </tbody>
</table>

Agora podemos instruir o sistema a exibir todos os clientes que realizaram mais de um pedido, agrupando-os pelo nome e contando o número de pedidos. O código adequado é o seguinte:

```sql
SELECT Lista_de_Clientes.Nome, COUNT(Item_01.Número_do_Pedido) AS Número_de_Pedidos
FROM (Item_01
INNER JOIN Lista_de_Clientes ON Item_01. Número_do_Cliente = Lista_de_Clientes.Número_do_Cliente)
GROUP BY Nome
HAVING COUNT(Item_01.Número_do_Pedido) > 1;
```

Esta é a saída que obtemos:

<table>
  <thead>
    <tr>
      <th>Nome</th>
      <th>Número de Pedidos</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Schmidt</td>
      <td>2</td>
    </tr>
  </tbody>
</table>

## Alternativa ao SQL HAVING

Uma alternativa ao SQL HAVING é o WHERE. No entanto, ambas as opções não podem ser usadas exatamente da mesma forma. WHERE é utilizado para registros individuais e pode ser combinado com SELECT, DELETE ou UPDATE. HAVING, por outro lado, é **exclusivamente para registros agrupados** e só é compatível com SELECT. WHERE é usado antes de GROUP BY, enquanto HAVING é usado depois. Além disso, apenas o SQL HAVING pode trabalhar com funções de agregação.

Dica Um servidor perfeitamente ajustado às suas necessidades: com o [SQL Server Hosting](https://www.ionos.com/cloud/sql-server-hosting "SQL Server Hosting —IONOS") da IONOS, você escolhe entre MSSQL, MySQL e MariaDB e se beneficia de uma forte arquitetura de segurança, desempenho excelente e um atendimento pessoal a qualquer momento.


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