Pergunta

Eu devo estar pesquisando no caminho errado ou eu estou tendo um momento estúpido no tempo.

Qual é a diferença entre HAVING e WHERE em uma declaração SQL SELECT?

EDIT: Eu marquei a resposta de Steven como o correto, uma vez que continha o bit chave de informações no link:

Quando GROUP BY não for usado, se comporta HAVING como uma cláusula WHERE

A situação que eu tinha visto o WHERE em não ter GROUP BY e é onde minha confusão começou. Claro, até que você sabe que isso não é possível especificar isso na questão.

Muito obrigado por todas as respostas que foram muito esclarecedor.

Foi útil?

Solução

TENDO especifica uma condição de pesquisa para uma grupo ou uma função de agregação usado na instrução SELECT.

Fonte

Outras dicas

TENDO: é usado para verificar as condições após a agregação ocorre
. ONDE:. É usado para verificar as condições antes a agregação ocorre

Este código:

select City, CNT=Count(1)
From Address
Where State = 'MA'
Group By City

Dá-lhe uma tabela de todas as cidades do MA e do número de endereços em cada cidade.

Este código:

select City, CNT=Count(1)
From Address
Where State = 'MA'
Group By City
Having Count(1)>5

Dá-lhe uma tabela de cidades em MA com mais de 5 endereços de e o número de endereços em cada cidade.

Número uma diferença para mim: se HAVING foi removido a partir da linguagem SQL, em seguida, a vida continuaria mais ou menos como antes. Certamente, um consultas minoritários teriam de ser reescrito usando uma tabela derivada, CTE, etc, mas eles seriam sem dúvida mais fácil de entender e manter como resultado. Talvez fornecedores otimizador de código teria de ser reescrito para a conta para isso, novamente uma oportunidade de melhoria dentro da indústria.

Agora, considere por um momento removendo WHERE da língua. Desta vez, a maioria de consultas existentes teriam de ser reescrito sem uma construção alternativa óbvia. Codificadores teria que começar por exemplo criativo junção interna para uma mesa que se sabe conter exatamente uma linha (por exemplo DUAL no Oracle) utilizando a cláusula ON para simular a cláusula WHERE antes. Tais construções seria inventado; seria óbvio que havia algo estava faltando a partir da linguagem e a situação seria pior, como resultado.

TL; DR. Poderemos perder HAVING amanhã e as coisas não seria pior, possivelmente melhor, mas o mesmo não pode ser dito de WHERE


A partir das respostas aqui, parece que muita gente não percebe que uma cláusula HAVING podem ser utilizadas sem uma cláusula GROUP BY. Neste caso, a cláusula HAVING é aplicada a toda a expressão de tabela e exige que apenas constantes aparecem na cláusula SELECT. Normalmente a cláusula HAVING envolverá agregados.

Este é mais útil do que parece. Por exemplo, considere esta consulta para testar se a coluna name é único para todos os valores em T:

SELECT 1 AS result
  FROM T
HAVING COUNT( DISTINCT name ) = COUNT( name );

Existem apenas dois resultados possíveis:. Se a cláusula HAVING é verdadeira, então o resultado de ser uma única linha que contém o valor 1, caso contrário, o resultado será o conjunto vazio

A cláusula HAVING foi adicionado ao SQL porque a palavra-chave WHERE não pode ser usado com funções de agregação.

Confira este w3schools ligar para mais informações

Sintaxe:

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value

Uma consulta como esta:

SELECT column_name, COUNT( column_name ) AS column_name_tally
  FROM table_name
 WHERE column_name < 3
 GROUP 
    BY column_name
HAVING COUNT( column_name ) >= 3;

... pode ser reescrito usando uma tabela derivada (e omitindo o HAVING) como este:

SELECT column_name, column_name_tally
  FROM (
        SELECT column_name, COUNT(column_name) AS column_name_tally
          FROM table_name
         WHERE column_name < 3
         GROUP 
            BY column_name
       ) pointless_range_variable_required_here
 WHERE column_name_tally >= 3;

A diferença entre os dois é em relação ao GROUP BY:

  • WHERE vem antes GROUP BY; SQL avalia a cláusula WHERE antes registra grupos.

  • TENDO vem depois GROUP BY; SQL avalia TENDO após registros agrupa.

 select diagrama declaração

Referências

HAVING é usado quando você estiver usando um agregado tais como GROUP BY.

SELECT edc_country, COUNT(*)
FROM Ed_Centers
GROUP BY edc_country
HAVING COUNT(*) > 1
ORDER BY edc_country;

WHERE é aplicada como uma limitação no set retornado por SQL; ele usa built-in oeprations conjunto e índices e, portanto, é a maneira mais rápida de SQL para conjuntos de resultados do filtro. Sempre use ONDE sempre que possível.

TENDO é necessário para alguns filtros agregados. Ele filtra a consulta após o SQL recuperou, montado e ordenados os resultados. Portanto, é muito mais lento do que onde e deve ser evitado, exceto naquelas situações que exigem isso.

SQL Server vai deixar você fugir com o uso TENDO mesmo quando ONDE seria muito mais rápido. Não fazê-lo.

cláusula WHERE não funciona para funções agregadas
meio: você não deve usar como esta nome da tabela

: bônus
SELECT name  
FROM bonus  
GROUP BY name  
WHERE sum(salary) > 200  

AQUI Em vez de usar a cláusula WHERE você tem que usar TENDO ..

sem usar a cláusula GROUP BY, HAVING apenas funciona como cláusula WHERE

SELECT name  
FROM bonus  
GROUP BY name  
HAVING sum(salary) > 200  

Diferença b w WHERE e HAVING cláusula /:

A principal diferença entre WHERE e cláusula HAVING é, WHERE é utilizado para operações de linha e HAVING é utilizado para operações de coluna.

Por que precisamos HAVING cláusula?

Como sabemos, funções agregadas só pode ser realizado em colunas, por isso não podemos usar funções agregadas na cláusula WHERE. Por isso, usamos funções agregadas na cláusula HAVING.

Quando GROUP BY não é utilizado, as cláusulas WHERE e HAVING são essencialmente equivalentes.

No entanto, quando GROUP BY é usado:

  • A cláusula WHERE é usado para filtrar registros de um resultado. o filtragem ocorre antes de quaisquer agrupamentos são feitas.
  • A cláusula HAVING é usado para valores de filtro a partir de um grupo (isto é, a verificar as condições após a agregação em grupos foi realizado).

Recurso Aqui

Eu tive um problema e descobri uma outra diferença entre WHERE e HAVING. Ele não agir da mesma forma em colunas indexadas.

WHERE my_indexed_row = 123 irá mostrar linhas e automaticamente executar uma "ASC ORDEM" em outras linhas indexadas.

mostra HAVING my_indexed_row = 123 tudo, desde a mais antiga linha "inserido" para a mais recente, sem ordenação.

Uma maneira de pensar sobre isso é que a cláusula having é um filtro adicional para a cláusula WHERE.

registros filtros WHERE cláusula é usado de um resultado. O filtro ocorre antes de quaisquer agrupamentos são feitas. Um TENDO cláusula é usado para valores de filtro a partir de um grupo

Em uma consulta de agregação, (Qualquer consulta Onde uma função de agregação é usado) predicados numa cláusula onde são avaliados antes do conjunto de resultados intermédios agregada é gerada,

Os predicados em uma cláusula Tendo são aplicadas ao conjunto de resultados agregada após ter sido gerado. É por isso que as condições de predicados sobre valores agregados devem ser colocados em ter cláusula, não na cláusula WHERE, e por que você pode usar aliases definidas na cláusula Select em uma cláusula HAVING, mas não em uma cláusula WHERE.

WHERE é utilizado para a comparação de valores na tabela de base, ao passo que a cláusula HAVING pode ser utilizado para filtrar os resultados das funções de agregação no conjunto resultado da consulta Clique aqui !

Eu adianta ter para restringir uma consulta com base nos resultados de uma função de agregação. POR EXEMPLO. select * no grupo blahblahblah pela contagem ALGO ter (algo)> 0

A partir aqui .

o padrão SQL requer que TENDO deve fazer referência apenas as colunas na GRUPO cláusula BY ou colunas usadas em funções de agregação

em oposição à cláusula ONDE qual é aplicada a linhas de dados

Ao trabalhar em um projeto, este também foi a minha pergunta. Como dito acima, o TENDO verifica a condição do resultado da consulta já encontrados. Mas WHERE é para verificação de condição, enquanto consulta é executada.

Deixe-me dar um exemplo para ilustrar isso. Suponha que você tenha uma tabela de banco de dados assim.

UserTable {UserID int, data datefield, dailyincome int}

Suponha, as seguintes linhas são na tabela:

1, 2011-05-20, 100

1, 2011-05-21, 50

1, 2011-05-30, 10

2, 2011-05-30, 10

2, 2011-05-20, 20

Agora, queremos obter os userids e sum(dailyincome) cujos sum(dailyincome)>100

Se nós escrevemos:

ID de usuário SELECT, sum (dailyincome) DE ONDE UserTable sum (dailyincome)> 100 GROUP BY ID de usuário

Este será um erro. A consulta correta seria:

ID de usuário SELECT, sum (dailyincome) do grupo UserTable POR UserID TENDO sum (dailyincome)> 100

Pode ser apenas que o assunto do "onde" é uma linha, enquanto o assunto de "ter" é um grupo. Estou certo?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top