É possível ter uma cláusula WHERE após uma cláusula HAVING?
Pergunta
É possível usar uma cláusula WHERE após uma cláusula HAVING?
A primeira coisa que vem à minha mente é sub consultas, mas não tenho certeza.
P.S. Se a resposta for afirmativa, você poderia dar alguns exemplos?
Solução
Não, não na mesma consulta.
A cláusula where
vai antes do having
eo group by
. Se você quiser filtrar os registros antes do agrupamento a condição vai na cláusula where
, e se você quiser filtrar os registros agrupados a condição vai na cláusula having
:
select ...
from ...
where ...
group by ...
having ...
Se nenhum desses são possíveis de usar por algum motivo estranho, você tem que fazer a consulta uma subconsulta de modo que você pode colocar a cláusula where
na consulta externa:
select ...
from (
select ...
from ...
where ...
group by ...
having ...
) x
where ...
Outras dicas
A cláusula HAVING é apenas uma cláusula WHERE após um GROUP BY. Por que não colocar o seu ONDE condições na cláusula HAVING?
Se for uma pergunta capciosa, é possível se o ONDE eo TENDO não estão no mesmo nível, como você mencionada, com subconsulta.
Eu acho que algo como isso iria funcionar
valor TENDO = (SELECT max (valor) FROM foo ONDE crit = 123)
P.S .: por que você estava perguntando? Você tem um problema específico?
p.s.s: OK bobo mim, eu perdi a "entrevista *" tag ...
De ajudar a selecionar
Processamento da ordem de WHERE, GROUP BY, e TENDO Cláusulas Os passos seguintes mostrar a ordem de processamento para um SELECT declaração com uma cláusula WHERE, um grupo BY e uma cláusula HAVING:
A cláusula FROM retorna uma inicial conjunto de resultados.
exclui a cláusula WHERE linhas não conhecer a sua condição de pesquisa.
A cláusula GROUP BY recolhe o seleccionado linhas em um grupo para cada valor único na cláusula GROUP BY.
As funções de agregação especificada no selecione lista valores de resumo calcular para cada grupo.
A cláusula HAVING adicionalmente exclui linhas que não cumprem a sua pesquisa condição.
Então, não, você não pode.
Dentro do mesmo âmbito, a resposta não é. Se subconsultas é permitido, então você pode evitar o uso HAVING
inteiramente.
Eu acho HAVING
é um anacronismo. Hugh Darwen refere-se a HAVING
como "a loucura de consultas estruturadas":
No SQL idade, a cláusula
WHERE
não podia ser utilizada em resultados de agregação, assim eles tiveram que inventarHAVING
(com a mesma ou seja, comoWHERE
):SELECT D#, AVG(Salary) AS Avg_Sal FROM Emp GROUP BY D# HAVING AVG(Salary) > 999;
Mas será que alguma vez tiveram
HAVING
se em 1979, pode-se escrever:SELECT * FROM ( SELECT D#, AVG(Sal) AS Avg_Sal FROM Emp GROUP BY D# ) AS dummy WHERE Avg_Sal > 999;
Eu suspeito fortemente a resposta à pergunta de Darwen não é.