Resumo : neste tutorial, você aprenderá como usar HAVING
a cláusula MySQL para especificar uma condição de filtro para grupos de linhas ou agregações.
Introdução à cláusula MySQL HAVING
A HAVING
cláusula é usada em conjunto com a cláusula GROUP BY para filtrar os grupos com base em uma condição especificada.
A HAVING
cláusula permite aplicar uma condição aos grupos retornados pela GROUP BY
cláusula e incluir apenas grupos que atendam à condição especificada.
Aqui está a sintaxe da HAVING
cláusula:
SELECT
select_list
FROM
table_name
WHERE
search_condition
GROUP BY
group_by_expression
HAVING
group_condition;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Nesta sintaxe, você especifica uma condição na HAVING
cláusula.
A HAVING
cláusula avalia cada grupo retornado pela GROUP BY
cláusula. Se o resultado for verdadeiro (1), inclui o grupo no conjunto de resultados.
A HAVING
cláusula aplica a condição a grupos de linhas, enquanto a WHERE
cláusula aplica a condição a linhas individuais
Se você omitir a GROUP BY
cláusula, a HAVING
cláusula se comportará como a WHERE
cláusula.
O MySQL avalia a HAVING
cláusula após as cláusulas FROM
, e , mas antes das cláusulas WHERE
, , e :SELECT
GROUP BY
DISTINCT
SELECT
ORDER BY
LIMIT
Observe que o padrão SQL especifica que a cláusula HAVING
anterior SELECT
e GROUP BY
a cláusula posterior são avaliadas.
Exemplos de cláusula HAVING do MySQL
Vejamos alguns exemplos de uso da HAVING
cláusula para entender como ela funciona.
Usaremos a orderdetails
tabela do banco de dados de exemplo para a demonstração.
O seguinte usa a GROUP BY
cláusula para obter números de pedidos, o número de itens vendidos por pedido e o total de vendas de cada um na orderdetails
tabela:
SELECT
ordernumber,
SUM(quantityOrdered) AS itemsCount,
SUM(priceeach * quantityOrdered) AS total
FROM
orderdetails
GROUP BY
ordernumber;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
+-------------+------------+----------+
| ordernumber | itemsCount | total |
+-------------+------------+----------+
| 10100 | 151 | 10223.83 |
| 10101 | 142 | 10549.01 |
| 10102 | 80 | 5494.78 |
| 10103 | 541 | 50218.95 |
...
Agora, você pode descobrir qual pedido tem vendas totais maiores 1000
usando a HAVING
cláusula a seguir:
SELECT
ordernumber,
SUM(quantityOrdered) AS itemsCount,
SUM(priceeach * quantityOrdered) AS total
FROM
orderdetails
GROUP BY
ordernumber
HAVING
total > 1000;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
+-------------+------------+----------+
| ordernumber | itemsCount | total |
+-------------+------------+----------+
| 10100 | 151 | 10223.83 |
| 10101 | 142 | 10549.01 |
| 10102 | 80 | 5494.78 |
...
É possível formar uma condição complexa na HAVING
cláusula usando operadores lógicos como OR
e AND
.
O exemplo a seguir usa a HAVING
cláusula para localizar pedidos com valores totais maiores 1000
e contendo mais de 600
itens:
SELECT
ordernumber,
SUM(quantityOrdered) AS itemsCount,
SUM(priceeach*quantityOrdered) AS total
FROM
orderdetails
GROUP BY ordernumber
HAVING
total > 1000 AND
itemsCount > 600;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Suponha que você queira encontrar todos os pedidos que já foram enviados e possuem um valor total maior que 1500, você pode unir a orderdetails
tabela com a orders
tabela usando a INNER JOIN
cláusula e aplicar uma condição na status
coluna e total
agregar conforme mostrado na consulta a seguir:
SELECT
a.ordernumber,
status,
SUM(priceeach*quantityOrdered) total
FROM
orderdetails a
INNER JOIN orders b
ON b.ordernumber = a.ordernumber
GROUP BY
ordernumber,
status
HAVING
status = 'Shipped' AND
total > 1500;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
A HAVING
cláusula só é útil quando você a utiliza com a GROUP BY
cláusula para gerar a saída dos relatórios de alto nível.
Por exemplo, você pode usar a HAVING
cláusula para responder a perguntas como encontrar o número de pedidos neste mês, neste trimestre ou neste ano que tenham um valor total superior a 10 mil.
Resumo
- Use a
HAVING
cláusula MySQL com aGROUP BY
cláusula para especificar uma condição de filtro para grupos de linhas ou agregações.