Eu devo estar pesquisando no caminho errado ou estou tendo um momento estúpido no tempo.
Qual é a diferença entre HAVING
e WHERE
em umSQL SELECT
declaração?
EDIT: Marquei a resposta de Steven como a correta, pois continha as principais informações no link:
Quando
GROUP BY
não é usado,HAVING
comporta-se como umaWHERE
cláusula
A situação em que eu tinha visto a situação WHERE
não teve GROUP BY
e é onde minha confusão começou. Obviamente, até que você saiba disso, não poderá especificá-lo na pergunta.
HAVING
é um filtro de pós-agregação, enquanto queWHERE
é um filtro de pré-agregação.Respostas:
Fonte
fonte
HAVING: é usado para verificar as condições após a agregação.
ONDE: é usado para verificar as condições antes a agregação ocorra.
Este código:
Fornece uma tabela de todas as cidades em MA e o número de endereços em cada cidade.
Este código:
Fornece uma tabela de cidades em MA com mais de 5 endereços e o número de endereços em cada cidade.
fonte
Diferença número um para mim: se
HAVING
fosse removido da linguagem SQL, a vida continuaria mais ou menos como antes. Certamente, as consultas de uma minoria precisariam ser reescritas usando uma tabela derivada, CTE, etc., mas seriam mais fáceis de entender e manter como resultado. Talvez o código otimizador dos fornecedores precise ser reescrito para dar conta disso, novamente uma oportunidade de aprimoramento no setor.Agora considere por um momento remover
WHERE
do idioma. Dessa vez, a maioria das consultas existentes precisaria ser reescrita sem uma construção alternativa óbvia. Os codificadores precisariam ser criativos, por exemplo, junção interna a uma tabela conhecida por conter exatamente uma linha (por exemplo,DUAL
no Oracle) usando aON
cláusula para simular aWHERE
cláusula anterior . Tais construções seriam inventadas; seria óbvio que havia algo faltando no idioma e a situação seria pior como resultado.TL; DR, poderíamos perder
HAVING
amanhã e as coisas não seriam piores, possivelmente melhores, mas não se pode dizer o mesmoWHERE
.A partir das respostas aqui, parece que muitas pessoas não percebem que uma
HAVING
cláusula pode ser usada sem umaGROUP BY
cláusula. Nesse caso, aHAVING
cláusula é aplicada a toda a expressão da tabela e requer que apenas constantes apareçam naSELECT
cláusula. Normalmente, aHAVING
cláusula envolve agregados.Isso é mais útil do que parece. Por exemplo, considere esta consulta para testar se a
name
coluna é exclusiva para todos os valores emT
:Existem apenas dois resultados possíveis: se a
HAVING
cláusula for verdadeira, o resultado será uma única linha contendo o valor1
; caso contrário, o resultado será o conjunto vazio.fonte
A cláusula HAVING foi adicionada ao SQL porque a palavra-chave WHERE não pôde ser usada com funções agregadas.
Confira este link do w3schools para obter mais informações
Sintaxe:
Uma consulta como esta:
... pode ser reescrito usando uma tabela derivada (e omitindo a
HAVING
) assim:fonte
HAVING
foi adicionado porque as tabelas derivadas não foram adicionadas à linguagem e até que elas fossem SQL não estavam completas em termos relacionais e, uma vez que inevitavelmente seHAVING
tornaram redundantes.A diferença entre os dois está no relacionamento com a cláusula GROUP BY:
ONDE vem antes de GROUP BY; O SQL avalia a cláusula WHERE antes de agrupar registros.
TENDO vem depois de GROUP BY; SQL avalia HAVING após agrupar registros.
Referências
Sintaxe da instrução SQLite SELECT / diagrama de caminho de ferro
Sintaxe da instrução SELECT do Informix / diagrama ferroviário
fonte
SELECT 1 AS result FROM T HAVING...
- no seu diagrama não consigoHAVING
passar sem passar,GROUP BY
mas minha consulta perfeitamente válida e útil não temGROUP BY
. Ponto secundário: você não tem a opção de incluir valores literais naSELECT
cláusula.WHERE->HAVING
parte, por isso acho que merece muita atenção aos detalhes. Se você acha que minha resposta está errada, edite-a ou publique uma correção sugerida nos comentários.HAVING
é usado quando você está usando um agregado comoGROUP BY
.fonte
WHERE é aplicado como uma limitação no conjunto retornado pelo SQL; ele usa oeprations e índices do conjunto interno do SQL e, portanto, é a maneira mais rápida de filtrar os conjuntos de resultados. Sempre use WHERE sempre que possível.
É necessário ter alguns filtros agregados. Ele filtra a consulta APÓS o sql ter recuperado, montado e classificado os resultados. Portanto, é muito mais lento que WHERE e deve ser evitado, exceto nas situações que o exigem.
O SQL Server permitirá que você use o HAVING mesmo quando WHERE seria muito mais rápido. Não faça isso.
fonte
A cláusula WHERE não funciona para funções agregadas
significa: você não deve usar como este bônus: nome da tabela
AQUI Em vez de usar a cláusula WHERE, você deve usar HAVING ..
sem usar a cláusula GROUP BY, a cláusula HAVING funciona como a cláusula WHERE
fonte
Diferença entre preto e branco
WHERE
eHAVING
cláusula:A principal diferença entre
WHERE
e aHAVING
cláusula é,WHERE
é usada para operações de linha eHAVING
é usada para operações de coluna.Por que precisamos de
HAVING
cláusula?Como sabemos, funções agregadas só podem ser executadas em colunas; portanto, não podemos usar funções agregadas na
WHERE
cláusula. Portanto, usamos funções agregadas naHAVING
cláusula.fonte
Quando
GROUP BY
não é usado, as cláusulasWHERE
eHAVING
são essencialmente equivalentes.No entanto, quando
GROUP BY
é usado:WHERE
cláusula é usada para filtrar registros de um resultado. A filtragem ocorre antes de qualquer agrupamento ser feito.HAVING
cláusula é usada para filtrar valores de um grupo (ou seja, para verificar condições após a agregação em grupos ter sido executada).Recurso daqui
fonte
Uma maneira de pensar nisso é que a cláusula having é um filtro adicional para a cláusula where.
Uma cláusula WHERE é usada para filtrar registros de um resultado. O filtro ocorre antes de qualquer agrupamento ser feito. Uma cláusula HAVING é usada para filtrar valores de um grupo
fonte
Em uma consulta Agregada, (Qualquer consulta em que uma função agregada é usada) Predicados em uma cláusula where são avaliados antes que o conjunto de resultados intermediários agregados seja gerado,
Predicados em uma cláusula Having são aplicados ao conjunto de resultados agregados APÓS que ele foi gerado. É por isso que as condições predicadas dos valores agregados devem ser colocadas na cláusula Having, não na cláusula Where e por que você pode usar aliases definidos na cláusula Select em uma cláusula Having, mas não na cláusula Where.
fonte
Eu tive um problema e descobri outra diferença entre
WHERE
eHAVING
. Ele não age da mesma maneira em colunas indexadas.WHERE my_indexed_row = 123
mostrará linhas e executará automaticamente um "ORDER ASC" em outras linhas indexadas.HAVING my_indexed_row = 123
mostra tudo, desde a linha "inserida" mais antiga até a mais recente, sem pedidos.fonte
A partir daqui .
em oposição à cláusula WHERE que é aplicada às linhas do banco de dados
fonte
HAVING
décadas depois que ele foi 'reprovado' por tabelas derivadas.SELECT 1 FROM T HAVING COUNT(*) >= 1;
- não faz referência a colunas naGROUP BY
cláusula (não há nenhuma) nem colunas em funções agregadas (a consulta não faz referência a nenhuma coluna).Enquanto trabalhava em um projeto, essa também foi minha pergunta. Como mencionado acima, o HAVING verifica a condição no resultado da consulta já encontrado. Mas WHERE é para verificar a condição enquanto a consulta é executada.
Deixe-me dar um exemplo para ilustrar isso. Suponha que você tenha uma tabela de banco de dados como esta.
Suponha que as seguintes linhas estejam na tabela:
Agora, queremos obter os
userid
s esum(dailyincome)
cujasum(dailyincome)>100
Se escrevermos:
Isso será um erro. A consulta correta seria:
fonte
A cláusula WHERE é usada para comparar valores na tabela base, enquanto a cláusula HAVING pode ser usada para filtrar os resultados de funções agregadas no conjunto de resultados da consulta Clique aqui !
fonte
Quando GROUP BY não é usado, as cláusulas WHERE e HAVING são essencialmente equivalentes.
No entanto, quando GROUP BY é usado:
fonte
Eu uso HAVING para restringir uma consulta com base nos resultados de uma função agregada. EG selecione * no grupo blahblahblah com ALGO tendo contagem (ALGO)> 0
fonte
Pode ser que o assunto "onde" seja uma linha, enquanto o assunto "tendo" seja um grupo. Estou certo?
fonte