Resumo : neste tutorial, você aprenderá como usar o MySQL HAVING COUNT
para filtrar grupos com base no número de itens em cada grupo.
Introdução ao MySQL HAVING COUNT
No MySQL, a cláusula GROUP BY organiza as linhas em grupos. Ao combinar a GROUP BY
cláusula com a função COUNT , você obterá os grupos e o número de itens em cada grupo.
Para filtrar os grupos com base no número de itens em cada grupo, você usa a cláusula HAVING e a COUNT
função.
O seguinte ilustra a sintaxe básica para usar a HAVING
cláusula com a COUNT
função para filtrar grupos:
SELECT
c1,
COUNT(c2)
FROM
table_1
GROUP BY
c1
HAVING
COUNT(c2)...
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Observe que você não pode atribuir um alias à COUNT(column_2)
cláusula SELECT
e usar o alias da coluna na HAVING
cláusula assim:
SELECT
c1,
COUNT(c2) count_c2
FROM
table_1
GROUP BY
c1
HAVING
count_c2...
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
A razão é que o MySQL avalia a HAVING
cláusula antes da SELECT
cláusula. Portanto, no momento em que o MySQL avaliou a HAVING
cláusula, ele não conhece o alias da coluna count_c2
porque ainda não avaliou a SELECT
cláusula.
Exemplo MySQL HAVING COUNT
Tomaremos alguns exemplos de uso da HAVING
COUNT
cláusula
1) Exemplo simples de HAVING COUNT
Primeiro, crie uma nova tabela de vendas que tenha três colunas sale_id
, product_name
e sale_amount
:
CREATE TABLE sales (
id INT AUTO_INCREMENT,
product_name VARCHAR(50) NOT NULL,
sale_amount DECIMAL(10, 2) NOT NULL,
PRIMARY KEY(id)
);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Segundo, insira algumas linhas na tabela de vendas:
INSERT INTO sales (product_name, sale_amount)
VALUES
('Product A', 100.50),
('Product B', 75.25),
('Product A', 120.75),
('Product C', 50.00),
('Product B', 90.80);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Terceiro, conte o número de vendas por produto:
SELECT product_name, COUNT(id)
FROM sales
GROUP BY product_name;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
A consulta mostra os nomes dos produtos e o número de vendas de cada produto:
+--------------+-----------+
| product_name | COUNT(id) |
+--------------+-----------+
| Product A | 2 |
| Product B | 2 |
| Product C | 1 |
+--------------+-----------+
3 rows in set (0.00 sec)
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Para descobrir qual produto teve uma venda, você usa a HAVING
cláusula com a COUNT
função da seguinte forma:
SELECT
product_name,
COUNT(id)
FROM
sales
GROUP BY
product_name
HAVING
COUNT(id) = 1;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Saída:
+--------------+-----------+
| product_name | COUNT(id) |
+--------------+-----------+
| Product C | 1 |
+--------------+-----------+
1 row in set (0.00 sec)
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Da mesma forma, você pode encontrar os produtos que tiveram mais de uma venda utilizando o operador >
da HAVING
cláusula:
SELECT
product_name,
COUNT(id)
FROM
sales
GROUP BY
product_name
HAVING
COUNT(id) > 1;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Saída:
+--------------+-----------+
| product_name | COUNT(id) |
+--------------+-----------+
| Product A | 2 |
| Product B | 2 |
+--------------+-----------+
2 rows in set (0.00 sec)
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
2) Exemplo prático de HAVING com COUNT
Usaremos a tabela customers
e orders
as tabelas do banco de dados de exemplo :
A consulta a seguir usa a HAVING
cláusula com a COUNT
função para obter os clientes que fizeram mais de quatro pedidos:
SELECT
customerName,
COUNT(*) order_count
FROM
orders
INNER JOIN customers using (customerNumber)
GROUP BY
customerName
HAVING
COUNT(*) > 4
ORDER BY
order_count;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Saída:
+------------------------------+-------------+
| customerName | order_count |
+------------------------------+-------------+
| Australian Collectors, Co. | 5 |
| Danish Wholesale Imports | 5 |
| Dragon Souveniers, Ltd. | 5 |
| Down Under Souveniers, Inc | 5 |
| Reims Collectables | 5 |
| Mini Gifts Distributors Ltd. | 17 |
| Euro+ Shopping Channel | 26 |
+------------------------------+-------------+
7 rows in set (0.00 sec)
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Resumo
- Use a
HAVING COUNT
cláusula para filtrar grupos pelo número de itens em cada grupo.