Partilhar via


Usar cláusulas HAVING e WHERE na mesma consulta (Visual Database Tools)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada SQL do Azure do Azure Synapse AnalyticsAnalytics Platform System (PDW)

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 WHERE clá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 da WHERE cláusula são agrupadas.

  • A HAVING cláusula é então aplicada às linhas do conjunto de resultados. Somente os grupos que atendem às HAVING condições aparecem na saída da consulta. Você pode aplicar uma HAVING cláusula somente a colunas que também aparecem na GROUP BY clá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

  1. Especifique os grupos para a sua consulta. Para obter detalhes, consulte Agrupar Linhas nos Resultados da Consulta (Visual Database Tools).

  2. Se ainda não estiver no painel Critérios , adicione a coluna na qual você deseja basear a WHERE condição.

  3. Desmarque a coluna Saída , a menos que a coluna de dados faça parte da GROUP BY cláusula ou esteja incluída em uma função agregada.

  4. Na coluna Filtro , especifique a WHERE condição. O Designer de Consulta e Exibição adiciona a condição à HAVING cláusula da instrução SQL.

    Observação

    A consulta mostrada no exemplo para este procedimento une duas tabelas titles e publishers.

    Neste ponto da consulta, a instrução SQL contém uma HAVING clá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';
    
  5. 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 HAVING na instrução SQL e adiciona-a à cláusula WHERE.

    A instrução SQL muda para incluir uma WHERE clá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;