Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Em alguns casos, convém excluir linhas individuais de grupos (usando uma WHERE cláusula) antes de aplicar uma condição a grupos como um todo (usando uma HAVING cláusula).
Uma HAVING cláusula é como uma WHERE cláusula, mas aplica-se apenas a grupos como um todo (isto é, às linhas no conjunto de resultados que representam grupos), enquanto a WHERE cláusula se aplica a linhas individuais. Uma consulta pode conter uma WHERE cláusula e uma HAVING cláusula. Nesse caso:
A
WHEREcláusula é aplicada primeiro às linhas individuais nas tabelas ou objetos com valor de tabela no painel Diagrama . Apenas as linhas que satisfazem as condições daWHEREcláusula são agrupadas.A
HAVINGcláusula é então aplicada às linhas do conjunto de resultados. Somente os grupos que atendem àsHAVINGcondições aparecem na saída da consulta. Você pode aplicar umaHAVINGcláusula somente a colunas que também aparecem naGROUP BYcláusula ou em uma função agregada.
Especificar uma cláusula WHERE e HAVING em duas tabelas unidas
Observação
O banco de dados utilizado neste artigo é o pubs, disponível nos bancos de dados de exemplo Northwind e pubs para Microsoft SQL Server no GitHub.
Por exemplo, imagine que está a juntar as tabelas titles e publishers para criar uma consulta que mostra o preço médio dos livros para um conjunto de editores. Você quer ver o preço médio para apenas 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 acima de US $ 10,00.
Você pode estabelecer a primeira condição incluindo uma WHERE cláusula, que descarta quaisquer editores que não estejam na Califórnia, antes de calcular os preços médios. A segunda condição requer uma HAVING cláusula, porque a condição é baseada 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;
No Visual Database Tools do SQL Server Management Studio, você pode criar cláusulas HAVING e WHERE no painel Critérios . Por padrão, se você especificar uma condição de pesquisa para uma coluna, a condição se tornará parte da HAVING cláusula. No entanto, você pode alterar a condição para ser uma WHERE cláusula.
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, em seguida, especificar uma instância como parte da HAVING cláusula e a outra instância como parte da WHERE cláusula.
Especificar uma condição WHERE em uma consulta agregada
Especifique os grupos para a sua consulta. Para obter detalhes, consulte Agrupar Linhas nos Resultados da Consulta (Visual Database Tools).
Se ainda não estiver no painel Critérios , adicione a coluna na qual você deseja basear a
WHEREcondição.Desmarque a coluna Saída , a menos que a coluna de dados faça parte da
GROUP BYcláusula ou esteja incluída em uma função agregada.Na coluna Filtro , especifique a
WHEREcondição. O Designer de Consulta e Exibição adiciona a condição àHAVINGcláusula da instrução SQL.Observação
A consulta mostrada no exemplo para este procedimento une duas tabelas
titlesepublishers.Neste ponto da consulta, a instrução SQL contém uma
HAVINGcláusula: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 Onde na lista de opções de grupo e resumo. O Designer de Consulta e Vista remove a condição da cláusula
HAVINGna instrução SQL e adiciona-a à cláusulaWHERE.A instrução SQL muda para incluir uma
WHEREcláusula em vez disso: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;