Il est possible d'avoir une clause WHERE après une clause HAVING?
Question
Est-il possible d'utiliser une clause WHERE après une clause HAVING?
La première chose qui me vient à l'esprit est des sous-requêtes, mais je ne suis pas sûr.
P.S. Si la réponse est affirmative, pourriez-vous donner quelques exemples?
La solution
Non, pas dans la même requête.
La clause where
précède le having
et le group by
. Si vous souhaitez filtrer les enregistrements avant le regroupement de la condition va dans la clause where
, et si vous voulez filtrer l'état groupé enregistrements que va dans la clause having
:
select ...
from ...
where ...
group by ...
having ...
Si aucun des deux sont possibles à utiliser pour une raison étrange, vous devez faire la requête d'un sous-requête afin que vous puissiez mettre la clause where
dans la requête externe:
select ...
from (
select ...
from ...
where ...
group by ...
having ...
) x
where ...
Autres conseils
Une clause HAVING est juste une clause WHERE après un GROUP BY. Pourquoi ne pas mettre vos où les conditions dans la clause HAVING?
S'il est une question piège, il est possible que si le WHERE et having ne sont pas au même niveau, que vous mentionnais, avec sous-requête.
Je suppose que quelque chose comme ça fonctionnerait
= valeur HAVING (SELECT max (valeur) à partir de foo OÙ crit = 123)
p.s .: Pourquoi avez-vous demandez? Avez-vous un problème spécifique?
p.s.s: OK silly me, j'ai raté le tag "entretien *" ...
De l'aide SELECT
Traitement des commandes de WHERE, GROUP BY, et HAVING clauses Les étapes suivantes montrer l'ordre de traitement pour un SELECT déclaration avec une clause WHERE, un groupe PAR clause et une clause HAVING:
La clause FROM renvoie une première jeu de résultats.
La clause WHERE exclut les lignes non rencontre son état de recherche.
La clause GROUP BY recueille les lignes sélectionnées dans un groupe pour chaque valeur unique dans la clause GROUP BY.
Fonctions agrégats spécifiés dans la liste de sélection des valeurs récapitulatives de calcul pour chaque groupe.
La clause HAVING en outre exclut les lignes qui ne respectent pas la recherche condition.
Alors, ne vous ne pouvez pas.
Dans le même champ, la réponse est non. Si les sous-requêtes est autorisé alors vous pouvez éviter d'utiliser entièrement HAVING
.
Je pense que HAVING
est un anachronisme. Hugh Darwen fait référence à HAVING
comme « la folie des requêtes structurées »:
Dans l'ancien SQL, la clause ne pouvait pas
WHERE
être utilisé sur les résultats de l'agrégation, de sorte que ils ont dû inventerHAVING
(avec la même ce qui signifie queWHERE
):SELECT D#, AVG(Salary) AS Avg_Sal FROM Emp GROUP BY D# HAVING AVG(Salary) > 999;
Mais est-ce que nous ayons jamais eu
HAVING
si en 1979, on pourrait écrire:SELECT * FROM ( SELECT D#, AVG(Sal) AS Avg_Sal FROM Emp GROUP BY D# ) AS dummy WHERE Avg_Sal > 999;
Je soupçonne fortement la réponse à la question de Darwen est pas.