Partilhar via


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

  • A cláusula HAVING é aplicada às linhas no conjunto de resultados. Somente os grupos que atendem os critérios de HAVING são exibidos na saída da consulta. Você pode aplicar apenas uma cláusula HAVING 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

  1. Especifique os grupos para a sua consulta. Para obter detalhes, veja Agrupar linhas em resultados da consulta (Visual Database Tools).

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

  3. 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.

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

    Observação

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

    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'
    
  5. 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áusula WHERE.

    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;