MySQL TENDO

Resumo : neste tutorial, você aprenderá como usar HAVINGa cláusula MySQL para especificar uma condição de filtro para grupos de linhas ou agregações.

Introdução à cláusula MySQL HAVING

A HAVINGcláusula é usada em conjunto com a cláusula GROUP BY para filtrar os grupos com base em uma condição especificada.

A HAVINGcláusula permite aplicar uma condição aos grupos retornados pela GROUP BYcláusula e incluir apenas grupos que atendam à condição especificada.

Aqui está a sintaxe da HAVINGclá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 HAVINGcláusula.

A HAVINGcláusula avalia cada grupo retornado pela GROUP BYcláusula. Se o resultado for verdadeiro (1), inclui o grupo no conjunto de resultados.

A HAVINGcláusula aplica a condição a grupos de linhas, enquanto a WHEREcláusula aplica a condição a linhas individuais

Se você omitir a GROUP BYcláusula, a HAVINGcláusula se comportará como a WHERE cláusula.

O MySQL avalia a HAVINGcláusula após as cláusulas FROM, e , mas antes das cláusulas WHERE, , e :SELECTGROUP BYDISTINCTSELECTORDER BYLIMIT

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 HAVINGcláusula para entender como ela funciona.

Usaremos a orderdetailstabela do banco de dados de exemplo para a demonstração.

O seguinte usa a GROUP BYcláusula para obter números de pedidos, o número de itens vendidos por pedido e o total de vendas de cada um na orderdetailstabela:

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 )

Experimente

+-------------+------------+----------+
| 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 1000usando a HAVINGclá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 )

Experimente

+-------------+------------+----------+
| ordernumber | itemsCount | total    |
+-------------+------------+----------+
|       10100 |        151 | 10223.83 |
|       10101 |        142 | 10549.01 |
|       10102 |         80 |  5494.78 |
...

É possível formar uma condição complexa na HAVINGcláusula usando operadores lógicos como ORe AND.

O exemplo a seguir usa a HAVINGcláusula para localizar pedidos com valores totais maiores 1000e contendo mais de 600itens:

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 )

Experimente

Suponha que você queira encontrar todos os pedidos que já foram enviados e possuem um valor total maior que 1500, você pode unir a orderdetailstabela com a orderstabela usando a INNER JOINcláusula e aplicar uma condição na  statuscoluna e totalagregar 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 )

Experimente

MySQL HAVING com exemplo INNER JOIN

A HAVINGcláusula só é útil quando você a utiliza com a GROUP BYcláusula para gerar a saída dos relatórios de alto nível.

Por exemplo, você pode usar a HAVINGclá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 HAVINGcláusula MySQL com a GROUP BYcláusula para especificar uma condição de filtro para grupos de linhas ou agregações.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *