Usar cláusulas HAVING e WHERE na mesma consulta (Visual Database Tools)
Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics PDW (Analytics Platform System)
Em algumas instâncias, talvez você deseje excluir linhas individuais de grupos (usando uma cláusula WHERE
) antes de aplicar um critério aos grupos como um todo (usando uma cláusula HAVING
).
Uma cláusula HAVING
é como uma cláusula WHERE
, a diferença é que ela se aplica somente a grupos como um todo (ou seja, as linhas do conjunto de resultados que representam grupos), enquanto a cláusula WHERE
se aplica a linhas individuais. Uma consulta pode conter uma cláusula WHERE
e uma cláusula HAVING
. Nesse caso:
A cláusula
WHERE
é aplicada primeiro às linhas individuais nas tabelas ou objetos com valor de tabela no painel Diagrama. Apenas as linhas que atendem os critérios na cláusulaWHERE
são agrupadas.A cláusula
HAVING
é aplicada às linhas no conjunto de resultados. Somente os grupos que atendem os critérios deHAVING
são exibidos na saída da consulta. Você pode aplicar apenas uma cláusulaHAVING
em colunas que também são exibidas na cláusula GROUP BY ou em uma função de agregação.
Especificar uma cláusula WHERE e HAVING em duas tabelas unidas
Observação
O banco de dados usado neste artigo é o pubs
, disponível no Northwind e publica bancos de dados de amostra para o Microsoft SQL Server no GitHub.
Por exemplo, suponha que você está unindo as tabelas titles
e publishers
para criar uma consulta que mostra o preço médio dos livros de um conjunto de editoras. Você quer ver o preço médio de um único conjunto específico de editoras, talvez somente as editoras no estado da Califórnia. E, mesmo assim, você deseja ver o preço médio apenas se estiver acima de $10,00.
Você pode definir o primeiro critério incluindo uma cláusula WHERE
, que descarta todas as editoras que não estejam na Califórnia, antes de calcular os preços médios. O segundo critério requer uma cláusula HAVING
, porque o critério está baseado nos resultados de agrupamento e resumo dos dados. A instrução SQL resultante se parecerá com esta:
SELECT titles.pub_id, AVG(titles.price)
FROM titles INNER JOIN publishers
ON titles.pub_id = publishers.pub_id
WHERE publishers.state = 'CA'
GROUP BY titles.pub_id
HAVING AVG(price) > 10;
Nas Ferramentas de Banco de Dados Visual do SQL Server Management Studio, é possível criar as cláusulas HAVING
e WHERE
no painel Critérios. Por padrão, se você especificar um critério de pesquisa para uma coluna, o critério se tornará parte da cláusula HAVING
. Porém, você pode alterar o critério para ser uma cláusula WHERE
.
Você pode criar uma cláusula WHERE
e uma cláusula HAVING
envolvendo a mesma coluna. Para isso, adicione duas vezes a coluna ao painel Critérios e, depois, especifique uma instância como parte da cláusula HAVING
e outra como parte da cláusula WHERE
.
Especificar uma condição WHERE em uma consulta de agregação
Especifique os grupos para a sua consulta. Para obter detalhes, veja Agrupar linhas em resultados da consulta (Visual Database Tools).
Se ainda não estiver no painel Critérios, adicione a coluna em que você deseja basear a condição
WHERE
.Limpe a coluna Saída , a menos que a coluna de dados faça parte da cláusula GROUP BY ou esteja incluída em uma função de agregação.
Na coluna Filtro, especifique o critério
WHERE
. O Designer de Consulta e Exibição adiciona o critério à cláusulaHAVING
da instrução SQL.Observação
A consulta mostrada no exemplo para esse procedimento une duas tabelas,
titles
epublishers
.Neste momento da consulta, a instrução SQL contém uma cláusula
HAVING
:SELECT titles.pub_id, AVG(titles.price) FROM titles INNER JOIN publishers ON titles.pub_id = publishers.pub_id GROUP BY titles.pub_id HAVING publishers.state = 'CA'
Na coluna Agrupar por , selecione Where na lista de opções de grupo e resumo. O Designer de Consulta e Exibição remove o critério da cláusula
HAVING
na instrução SQL e a adiciona à cláusulaWHERE
.A instrução SQL é alterada para incluir uma cláusula
WHERE
em vez de:SELECT titles.pub_id, AVG(titles.price) FROM titles INNER JOIN publishers ON titles.pub_id = publishers.pub_id WHERE publishers.state = 'CA' GROUP BY titles.pub_id;