Quelle est la différence entre AVOIR et OÙ?
Je dois être googler dans le mauvais sens ou je vais avoir un stupide moment dans le temps.
Quelle est la différence entre HAVING
et WHERE
dans un SQL SELECT
déclaration?
EDIT: j'ai marqué Steven réponse comme correcte, car il contenait la clé de peu d'informations sur le lien:
Quand
GROUP BY
n'est pas utilisé,HAVING
se comporte comme unWHERE
clause
La situation que j'avais vu la WHERE
n'avait pas GROUP BY
et c'est là où ma confusion a commencé. Bien sûr, jusqu'à ce que vous savez cela, vous ne pouvez pas spécifier dans la question.
Merci beaucoup pour toutes les réponses qui ont été très instructives.
- La ligne que vous citez n'est pas la clé de bits à tous. La clé bits, comme wcm, a souligné, c'est que
HAVING
est un post-agrégation de filtre, alors queWHERE
est un pré-agrégation de filtre. - ce lien m'a aidé à mieux le comprendre plus que tous les commentaires ci-dessous, pensée, on pourrait obtenir de l'aide en ce codeproject.com/Articles/25258/...
Vous devez vous connecter pour publier un commentaire.
Source
AVOIR: est utilisé pour vérifier les conditions de après l'agrégation a lieu.
OÙ: est utilisé pour vérifier les conditions de avant l'agrégation a lieu.
Ce code:
Vous donne un tableau de toutes les villes dans le massachusetts et le nombre d'adresses dans chaque ville.
Ce code:
Vous donne un tableau de villes en MA avec plus de 5 adresses et le nombre d'adresses dans chaque ville.
Numéro un de la différence, pour moi: si
HAVING
a été supprimé depuis le langage SQL, la vie serait plus ou moins comme avant. Certes, une minorité des requêtes devront être réécrites à l'aide d'une table dérivée, CTE, etc, mais ils serait sans doute plus facile à comprendre et à maintenir comme un résultat. Peut-être que les vendeurs de l'optimiseur de code devra être réécrit pour tenir compte de cela, de nouveau une possibilité d'amélioration au sein de l'industrie.Maintenant, considérons un instant la suppression
WHERE
de la langue. Cette fois, le majorité de requêtes dans l'existence devra être réécrite sans une alternative évidente à construire. Codeurs aurait à faire preuve de créativité par exemple de jointure interne à une table connus pour contenir qu'une seule ligne (par exemple,DUAL
dans Oracle) à l'aide de laON
clause de simuler l'état de laWHERE
clause. De telles constructions serait artificiel; il serait évident qu'il y avait quelque chose qui manquait dans la langue et la situation serait pire qu'un résultat.TL;DR, nous pourrions perdre
HAVING
demain et les choses seraient pas pire, peut-être mieux, mais les mêmes ne peuvent pas être dit deWHERE
.De réponses ici, il semble que les gens ne se rendent pas compte qu'un
HAVING
clause peut être utilisé sansGROUP BY
clause. Dans ce cas, leHAVING
clause est appliquée à l'ensemble de la table d'expression et exige que seules les constantes apparaissent dans laSELECT
clause. Généralement, leHAVING
clause entraînera des agrégats.C'est plus utile qu'il n'y paraît. Considérons, par exemple, cette requête pour tester si le
name
colonne est unique pour toutes les valeurs deT
:Il y a seulement deux résultats possibles: si le
HAVING
clause est vrai, alors le résultat avec une seule ligne contenant la valeur1
, sinon le résultat sera l'ensemble vide.La clause HAVING a été ajouté à SQL, car le mot-clé where ne peut pas être utilisé avec les fonctions d'agrégation.
Découvrez ce w3schools lien pour plus d'informations
Syntaxe:
Une requête comme ceci:
...peut être réécrite en utilisant une table dérivée (et en omettant les
HAVING
) comme ceci:HAVING
a été ajouté parce que les tables dérivées n'avait pas été ajouté à la langue et jusqu'à ce qu'ils étaient SQL n'a pas été de manière relationnelle complète et une fois qu'ils ont inévitablement étéHAVING
est devenu redondant.La différence entre les deux est dans la relation à la clause GROUP BY:
OÙ vient avant le GROUP BY; SQL évalue la clause where avant d'enregistrement des groupes.
AVOIR vient après le GROUP BY; SQL évalue après il regroupe des enregistrements.
Références
SQLite Syntaxe de l'Instruction SELECT/chemin de Fer Diagramme
Informix Syntaxe de l'Instruction SELECT/chemin de Fer Diagramme
SELECT 1 AS result FROM T HAVING...
- en votre diagramme je n'arrive pas àHAVING
sans passer parGROUP BY
mais mon parfaitement valable et utile de la requête n'a pas deGROUP BY
. Point mineur: vous n'avez pas la possibilité d'inclure des valeurs littérales dans leSELECT
clause.WHERE->HAVING
partie, donc je pense que mérite une attention particulière aux détails. Si vous pensez que ma réponse est fausse alors de modifier ou de publier une suggestion de correction dans les commentaires.HAVING condition applied to rows rather than groups
. Est ce que le non-standard ou standard? Est-il toujours ou jamais ou parfois un GROUPE d'implicite PAR? Est-ce un comportement 100% compatible avec le standard, obsolète, un antipattern, dépendant de l'implémentation, ou dans l'avenir?GROUP BY
alors il n'y a pas implicite de regroupement. Mais je suis encore un peu confus quant à la façon de ce qui concerne votre diagramme manque un chemin d'accès valide.CREATE TABLE T (c CHAR(1)); INSERT INTO T VALUES ('a'),('a'); SELECT 'true' FROM T HAVING COUNT (c) = 2;
devraient être à une seule rangée de colonne unique résultat montranttrue
parce que la condition de recherche supprime pas les lignes c'est à dire n'a pas appliqué un groupe implicite par (si elle avait l'regroupés puisCOUNT(c)
serait de 1, la condition de recherche serait un échec c'est à dire un zéro ligne de résultat).HAVING
est utilisé lorsque vous utilisez un agrégat commeGROUP BY
.OÙ est appliqué comme une limitation sur l'ensemble retourné par SQL; il utilise SQL intégré dans l'ensemble oeprations et l'index et, par conséquent, est le moyen le plus rapide pour filtrer les résultats. Utilisez toujours OÙ la mesure du possible.
Est nécessaire pour certains les filtres globaux. Il les filtres de la requête APRÈS que sql a récupéré, assemblé, et trié les résultats. Par conséquent, il est beaucoup plus lent que celui OÙ et doit être évitée, sauf dans les situations qui le nécessitent.
SQL Server vous permettra de sortir avec l'aide de l'AVOIR quand même, OÙ serait beaucoup plus rapide. Ne pas le faire.
Clause where ne fonctionne pas pour les fonctions d'agrégation
moyens : vous ne devez pas utiliser comme ceci
bonus : nom de la table
ICI au Lieu d'utiliser la clause where vous devez utiliser et qui..
sans utiliser la clause GROUP BY, HAVING fonctionne comme clause where
Différence b/w
WHERE
etHAVING
clause:La principale différence entre
WHERE
etHAVING
clause est,WHERE
est utilisé pour les opérations de ligne etHAVING
est utilisé pour les opérations de colonne.Pourquoi nous avons besoin de
HAVING
clause?Comme nous le savons, les fonctions d'agrégation peuvent être effectuées uniquement sur les colonnes, de sorte que nous ne pouvons pas utiliser les fonctions d'agrégation dans
WHERE
clause. Par conséquent, nous utilisons les fonctions d'agrégation dansHAVING
clause.Quand
GROUP BY
n'est pas utilisé, leWHERE
etHAVING
clauses sont essentiellement équivalentes.Toutefois, lorsque
GROUP BY
est utilisé:WHERE
clause est utilisée pour filtrer les enregistrements à partir d'un résultat. L'le filtrage se produit avant tout des regroupements sont effectués.
HAVING
clause est utilisée pour filtrer les valeurs d'un groupe (c'est à dire, àvérifier les conditions après l'agrégation dans les groupes a été effectué).
Ressources de Ici
J'ai eu un problème et a trouvé une autre différence entre
WHERE
etHAVING
. Il ne pas agir de la même façon sur les colonnes indexées.WHERE my_indexed_row = 123
permettra d'afficher les lignes et d'effectuer automatiquement un "ORDRE de l'ASC" indexés sur d'autres lignes.HAVING my_indexed_row = 123
montre tout, de la plus ancienne "insérée" ligne à la dernière, aucune commande.Une façon de penser, c'est que la clause having est un filtre supplémentaire à la clause where.
Un OÙ clause est utilisée filtre les enregistrements à partir d'un résultat. Le filtre se trouve avant tout des regroupements sont effectués. Un AVOIR clause est utilisée pour filtrer les valeurs d'un groupe
Dans une requête d'Agrégation, (Toute requête d'Où une fonction d'agrégation est utilisée) de Prédicats dans une clause where sont évalués avant l'ensemble des intermédiaires de résultat est généré,
De prédicats dans une clause Having sont appliquées à la somme du résultat d'ensemble APRÈS qu'il a été généré. C'est pourquoi prédicat conditions sur le total des valeurs doit être placé dans la clause Having, pas dans la clause where, et pourquoi vous pouvez utiliser des alias définis dans la clause Select dans une Clause Having, mais pas dans une Clause where.
Clause where est utilisée pour comparer des valeurs dans la table de base, alors que la clause HAVING peut être utilisé pour filtrer les résultats de fonctions d'agrégation dans le jeu de résultats de la requête
Cliquez sur ici!
- Je utiliser pour contraindre une requête sur la base des résultats d'une fonction d'agrégation. E. G. select * dans blahblahblah groupe par quelque CHOSE ayant count(quelque CHOSE)>0
De ici.
par opposition à la clause where qui est appliqué à la base de données des lignes
HAVING
décennies après qu'il était "obsolète" par les tables dérivées.SELECT 1 FROM T HAVING COUNT(*) >= 1;
- ne pas faire référence à des colonnes dans laGROUP BY
de l'alinéa (il y en a aucun), ni les colonnes dans des fonctions d'agrégation (requête fait référence à aucun des colonnes à tous).Tout en travaillant sur un projet, c'était aussi à ma question. Comme indiqué ci-dessus, le AVOIR vérifie la condition sur le résultat de la requête déjà trouvé. Mais OÙ est pour la vérification de la condition, tandis que la requête s'exécute.
Permettez-moi de donner un exemple pour illustrer cela. Supposons que vous avez une table de base de données de ce genre.
Supposons que, les lignes suivantes dans le tableau:
Maintenant, nous voulons obtenir le
userid
s etsum(dailyincome)
dontsum(dailyincome)>100
Si nous écrire:
Ce sera une erreur. La requête appropriée serait:
Il peut être juste que le sujet de "où" est une ligne, alors que le sujet de l ' "avoir" est un groupe. Suis-je le droit?