Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
aplica-se a:SQL Server
Banco de Dados SQL do Azure
Instância Gerenciada de SQL do Azure
Azure Synapse Analytics
Analytics Platform System (PDW)
Em alguns casos, talvez você queira excluir linhas individuais de grupos (usando uma cláusula WHERE
) antes de aplicar uma condição a grupos como um todo (usando uma cláusula HAVING
).
Uma cláusula HAVING
é como uma cláusula WHERE
, mas se aplica apenas a grupos como um todo (ou seja, às linhas no 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. Somente as linhas que atendem às condições na cláusulaWHERE
são agrupadas.A cláusula
HAVING
é então aplicada às linhas no conjunto de resultados. Somente os grupos que atendem às condições deHAVING
aparecem na saída da consulta. Você pode aplicar uma cláusulaHAVING
somente a colunas que também aparecem na cláusula GROUP BY ou em uma função de agregação.
Especificar uma cláusula WHERE e HAVING em duas tabelas unidas
Nota
O banco de dados usado neste artigo é o banco de dados pubs
, disponível nos bancos de dados de exemplo Northwind e pubs para o Microsoft SQL Server no GitHub.
Por exemplo, imagine que você está ingressando nas tabelas titles
e publishers
para criar uma consulta mostrando o preço médio do livro para um conjunto de editores. Você quer ver o preço médio apenas para um conjunto específico de editores - talvez apenas os editores no estado da Califórnia. E mesmo assim, você quer ver o preço médio apenas se for mais de US $ 10,00.
Você pode estabelecer a primeira condição incluindo uma cláusula WHERE
, que descarta todos os editores que não estão na Califórnia, antes de calcular os preços médios. A segunda condição requer uma cláusula HAVING
, pois a condição se baseia nos resultados do agrupamento e resumo dos dados. A instrução SQL resultante pode ter esta aparência:
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, você pode criar cláusulas HAVING
e WHERE
no painel de critérios . Por padrão, se você especificar uma condição de pesquisa para uma coluna, a condição se tornará parte da cláusula HAVING
. No entanto, você pode alterar a condição para ser uma cláusula WHERE
.
Você pode criar uma cláusula WHERE
e uma cláusula HAVING
envolvendo a mesma coluna. Para fazer isso, você deve adicionar a coluna duas vezes ao painel Critérios e especificar uma instância como parte da cláusula HAVING
e a outra instância como parte da cláusula WHERE
.
Especificar uma condição WHERE em uma consulta de agregação
Especifique os grupos para sua consulta. Para obter detalhes, consulte Agrupar linhas em resultados da consulta (Visual Database Tools).
Se ainda não estiver no painel Critérios, adicione a coluna na qual você deseja basear a condição
WHERE
.Desmarque a coluna Saída, a menos que a coluna de dados faça parte da cláusula GROUP BY ou incluída em uma função de agregação.
Na coluna Filtro, especifique a condição
WHERE
. O Designer de Consulta e Exibição adiciona a condição à cláusulaHAVING
da instrução SQL.Nota
A consulta mostrada no exemplo para este procedimento une duas tabelas,
titles
epublishers
.Neste ponto 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 a condição da cláusula
HAVING
na instrução SQL e a adiciona à cláusulaWHERE
.Em vez disso, a instrução SQL muda para incluir uma cláusula
WHERE
: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;