Je dois googler dans le mauvais sens ou je passe un moment stupide dans le temps.
Quelle est la différence entre HAVING
et WHERE
dans une SQL SELECT
déclaration?
EDIT: J'ai marqué la réponse de Steven comme étant la bonne, car elle contenait les informations clés sur le lien:
Lorsque
GROUP BY
n'est pas utilisé,HAVING
se comporte comme uneWHERE
clause
La situation dans laquelle je l'avais vu WHERE
n'avait pas GROUP BY
et c'est là que ma confusion a commencé. Bien sûr, tant que vous ne le savez pas, vous ne pouvez pas le spécifier dans la question.
HAVING
s'agit d'un filtre de post-agrégation, alors qu'ilWHERE
s'agit d'un filtre de pré-agrégation.Réponses:
La source
la source
AYANT: est utilisé pour vérifier les conditions après l'agrégation.
OERE: est utilisé pour vérifier les conditions avant l'agrégation.
Ce code:
Vous donne un tableau de toutes les villes de MA et le nombre d'adresses dans chaque ville.
Ce code:
Vous donne un tableau des villes de MA avec plus de 5 adresses et le nombre d'adresses dans chaque ville.
la source
La différence numéro un pour moi: si elle
HAVING
était supprimée du langage SQL, la vie continuerait plus ou moins comme avant. Certes, une requête minoritaire devrait être réécrite à l'aide d'une table dérivée, CTE, etc., mais il serait sans doute plus facile à comprendre et à maintenir en conséquence. Peut-être que le code d'optimisation des fournisseurs devrait être réécrit pour en tenir compte, encore une fois une opportunité d'amélioration au sein de l'industrie.Considérons maintenant un instant la suppression
WHERE
de la langue. Cette fois, la majorité des requêtes existantes devraient être réécrites sans construction alternative évidente. Les codeurs devraient faire preuve de créativité, par exemple une jointure interne à une table connue pour contenir exactement une ligne (par exempleDUAL
dans Oracle) en utilisant laON
clause pour simuler laWHERE
clause précédente . De telles constructions seraient artificielles; il serait évident qu'il manquait quelque chose dans la langue et la situation serait pire en conséquence.TL; DR nous pourrions perdre
HAVING
demain et les choses ne seraient pas pires, peut-être mieux, mais on ne peut pas en dire autantWHERE
.D'après les réponses ici, il semble que beaucoup de gens ne réalisent pas qu'une
HAVING
clause peut être utilisée sansGROUP BY
clause. Dans ce cas, laHAVING
clause est appliquée à l'expression de table entière et requiert que seules les constantes apparaissent dans laSELECT
clause. En règle générale, laHAVING
clause impliquera des agrégats.C'est plus utile qu'il n'y paraît. Par exemple, considérez cette requête pour tester si la
name
colonne est unique pour toutes les valeurs dansT
:Il n'y a que deux résultats possibles: si la
HAVING
clause est vraie, le résultat sera une seule ligne contenant la valeur1
, sinon le résultat sera l'ensemble vide.la source
La clause HAVING a été ajoutée à SQL car le mot clé WHERE n'a pas pu être utilisé avec des fonctions d'agrégation.
Consultez ce lien w3schools pour plus d'informations
Syntaxe:
Une requête comme celle-ci:
... peut être réécrit en utilisant une table dérivée (et en omettant
HAVING
) comme ceci:la source
HAVING
été ajouté parce que les tables dérivées n'avaient pas été ajoutées au langage et jusqu'à ce qu'elles soient SQL n'était pas complètement complète et une fois qu'elles étaient inévitablementHAVING
devenues redondantes.La différence entre les deux réside dans la relation avec la clause GROUP BY:
O comes vient avant GROUP BY; SQL évalue la clause WHERE avant de regrouper les enregistrements.
AYANT vient après GROUP BY; SQL évalue HAVING après avoir regroupé les enregistrements.
Références
Syntaxe de l'instruction SQLite SELECT / Diagramme ferroviaire
Syntaxe des instructions Informix SELECT / Diagramme ferroviaire
la source
SELECT 1 AS result FROM T HAVING...
- dans votre diagramme, je ne peux pas accéderHAVING
sans passer parGROUP BY
mais ma requête parfaitement valide et utile n'a pasGROUP BY
. Point mineur: vous n'avez pas la possibilité d'inclure des valeurs littérales dans laSELECT
clause.WHERE->HAVING
partie, donc je pense qu'il mérite une attention particulière aux détails. Si vous pensez que ma réponse est fausse, modifiez-la ou postez une correction suggérée dans les commentaires.HAVING
est utilisé lorsque vous utilisez un agrégat tel queGROUP BY
.la source
WHERE est appliqué comme une limitation sur l'ensemble renvoyé par SQL; il utilise les index et les fonctions d'ensembles intégrés de SQL et est donc le moyen le plus rapide de filtrer les ensembles de résultats. Utilisez toujours OERE autant que possible.
AVOIR est nécessaire pour certains filtres d'agrégats. Il filtre la requête APRÈS sql a récupéré, assemblé et trié les résultats. Par conséquent, il est beaucoup plus lent que OERE et doit être évité, sauf dans les situations qui l'exigent.
SQL Server vous permettra de vous débarrasser de l'utilisation de HAVING même lorsque WHERE serait beaucoup plus rapide. Ne le fais pas.
la source
La clause WHERE ne fonctionne pas pour les fonctions d'agrégation
signifie: vous ne devez pas utiliser comme ce bonus: nom de table
ICI Au lieu d'utiliser la clause WHERE, vous devez utiliser HAVING ..
sans utiliser la clause GROUP BY, la clause HAVING fonctionne comme la clause WHERE
la source
Différence n / b
WHERE
etHAVING
clause:La principale différence entre
WHERE
et laHAVING
clause est,WHERE
est utilisée pour les opérations de ligne etHAVING
est utilisée pour les opérations de colonne.Pourquoi avons-nous besoin d'une
HAVING
clause?Comme nous le savons, les fonctions d'agrégation ne peuvent être exécutées que sur des colonnes, nous ne pouvons donc pas utiliser de fonctions d'agrégation dans la
WHERE
clause. Par conséquent, nous utilisons des fonctions d'agrégation dans laHAVING
clause.la source
Lorsque
GROUP BY
n'est pas utilisé, les clausesWHERE
etHAVING
sont essentiellement équivalentes.Cependant, quand
GROUP BY
est utilisé:WHERE
clause est utilisée pour filtrer les enregistrements d'un résultat. Le filtrage se produit avant tout regroupement.HAVING
clause est utilisée pour filtrer les valeurs d'un groupe (c'est-à-dire pour vérifier les conditions une fois l'agrégation en groupes effectuée).Ressource d' ici
la source
Une façon de penser est que la clause having est un filtre supplémentaire à la clause where.
Une clause WHERE est utilisée pour filtrer les enregistrements d'un résultat. Le filtre se produit avant tout regroupement. Une clause HAVING est utilisée pour filtrer les valeurs d'un groupe
la source
Dans une requête d'agrégation, (toute requête dans laquelle une fonction d'agrégation est utilisée) les prédicats d'une clause where sont évalués avant la génération de l'ensemble de résultats intermédiaires agrégés,
Les prédicats d'une clause having sont appliqués au jeu de résultats agrégé APRÈS sa génération. C'est pourquoi les conditions de prédicat sur les valeurs agrégées doivent être placées dans la clause Have, pas dans la clause Where, et pourquoi vous pouvez utiliser des alias définis dans la clause Select dans une clause Have, mais pas dans une clause Where.
la source
J'ai eu un problème et j'ai découvert une autre différence entre
WHERE
etHAVING
. Il n'agit pas de la même manière sur les colonnes indexées.WHERE my_indexed_row = 123
affichera les lignes et effectuera automatiquement un "ORDER ASC" sur les autres lignes indexées.HAVING my_indexed_row = 123
affiche tout, de la plus ancienne ligne "insérée" à la plus récente, sans ordre.la source
D' ici .
par opposition à la clause WHERE qui est appliquée aux lignes de la base de données
la source
HAVING
décennies après qu'il a été «déprécié» par les tableaux dérivés.SELECT 1 FROM T HAVING COUNT(*) >= 1;
- ne référence pas les colonnes dans laGROUP BY
clause (il n'y en a pas) ni les colonnes dans les fonctions d'agrégation (la requête ne fait référence à aucune colonne).Tout en travaillant sur un projet, c'était aussi ma question. Comme indiqué ci-dessus, le HAVING vérifie la condition sur le résultat de la requête déjà trouvé. Mais OERE est pour vérifier la condition pendant l'exécution de la requête.
Permettez-moi de donner un exemple pour illustrer cela. Supposons que vous ayez une table de base de données comme celle-ci.
Supposons que les lignes suivantes soient dans le tableau:
Maintenant, nous voulons obtenir le
userid
s etsum(dailyincome)
dontsum(dailyincome)>100
Si nous écrivons:
Ce sera une erreur. La bonne requête serait:
la source
La clause WHERE est utilisée pour comparer les valeurs de la table de base, tandis que la clause HAVING peut être utilisée pour filtrer les résultats des fonctions d'agrégation dans le jeu de résultats de la requête Cliquez ici !
la source
Lorsque GROUP BY n'est pas utilisé, les clauses WHERE et HAVING sont essentiellement équivalentes.
Cependant, lorsque GROUP BY est utilisé:
la source
J'utilise HAVING pour contraindre une requête basée sur les résultats d'une fonction d'agrégation. EG select * in blahblahblah group by SOMETHING having count (SOMETHING)> 0
la source
Il se peut que le sujet du "où" soit une ligne, tandis que le sujet du "avoir" soit un groupe. Ai-je raison?
la source