7
votes

Pourquoi avez-vous "où" quand il y a "avoir"

Je sais que c'est beaucoup discuté, mais aucune de mes recherches ne pourrait me convaincre la différence entre '' et ' ayant des clauses 's dans mysql. D'après ce que je comprends, nous pouvons réaliser tout ce qui peut être fait avec "Où" clause utilisant " ayant ". Pour par exemple. Sélectionnez * à partir des utilisateurs ayant USERNAME = 'admin' . Alors pourquoi avez-vous besoin '' clause? Utilise-t-il des différences de performance?


1 commentaires

4 Réponses :


1
votes

où est évalué au niveau d'une seule ligne, alors que d'avoir est utilisé pour le groupe par expressions.


0 commentaires

3
votes

la différence entre ayant code> à partir de où la clause code> est que ayant code> prend en charge les colonnes agrégées tandis que où code> n'est pas parce que Il n'est applicable que pour les lignes individuelles., EG

SELECT ID
FROM tableName
GROUP BY ID
HAVING COUNT(ID) > 1  --- <<== HERE


3 commentaires

Merci. Mais je connais la différence.Lorsque avez-vous besoin d'utiliser où tout peut être atteint en utilisant la clause?


Dans votre exemple, ils font la même chose, mais si vous êtes un bon développeur SQL, vous devez savoir où utiliser les deux mots-clés. est évalué d'abord avant la clause .


Des documents mysql, "Vous pouvez utiliser des alias si vous utilisez au lieu d'avoir l'une des différences définies entre les deux clauses. Ayant également plus de lenteur et ne sera pas optimisé, mais si vous placez une fonction complexe comme ceci dans votre endroit où vous n'attendez évidemment pas une grande vitesse. "



1
votes

avec la clause , vous pouvez spécifier une condition pour filtrer groupes par opposition au filtrage individu rangées, qui arrive dans le phase.

Seuls les groupes pour lesquels l'expression logique dans le ayant La clause évalue à True est renvoyée par le ayant phase. Groupes pour lesquels l'expression logique évalue à false ou inconnue sont filtrées.

Lorsque groupe par n'est pas utilisé, ayant se comporte comme un clause. En ce qui concerne la comparaison de la performance, veuillez consulter cette article


0 commentaires

6
votes

Le clause filtre les données de la source avant agrégés, tandis que ayant filtre filtre des données après le groupe par a été appliqué. Généralement, cela signifie que tout filtre anti-agrégat peut apparaître dans l'un ou l'autre endroit, mais si vous avez une colonne qui n'est pas référencée dans votre requête, vous ne pouvez le filtrer que dans un clause.

Par exemple , si vous avez le tableau suivant: xxx

supposons que vous vouliez appliquer la requête suivante: xxx

mais vous seulement voulait inclure des lignes où id> 2 . Si vous mettez cela dans un ayant Clause, vous obtiendrez un < Strong> Erreur , car la colonne ID n'est pas disponible Post Agrégate car il ne figure pas dans la clause SELECT . Dans ce cas, vous seriez obligé d'utiliser un où la clause à la place: xxx

démo: http://www.sqlfiddle.com/#!2/f6741/16


0 commentaires