Je sais que c'est beaucoup discuté, mais aucune de mes recherches ne pourrait me convaincre la différence entre ' où code>' et '
ayant des clauses code>'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 code>". Pour par exemple.
Sélectionnez * à partir des utilisateurs ayant USERNAME = 'admin' code>. Alors pourquoi avez-vous besoin '
où code>' clause? Utilise-t-il des différences de performance? P>
4 Réponses :
où est évalué au niveau d'une seule ligne, alors que d'avoir est utilisé pour le groupe par expressions. P>
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
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. où code> est évalué d'abord avant la clause code> code>.
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. " I>
avec la clause code> code>, vous pouvez spécifier une condition pour filtrer groupes forts> par opposition au filtrage Lorsque où code> phase.
Seuls les groupes pour lesquels l'expression logique dans le ayant code>
La clause évalue à True est renvoyée par le
ayant code> phase. Groupes pour lesquels l'expression logique évalue à
false ou inconnue code> sont filtrées. P>
groupe par code> n'est pas utilisé,
ayant code> se comporte comme un
où code> clause.
En ce qui concerne la comparaison de la performance, veuillez consulter cette article p>
Le Par exemple , si vous avez le tableau suivant: p> supposons que vous vouliez appliquer la requête suivante: p> mais vous seulement voulait inclure des lignes où démo: http://www.sqlfiddle.com/#!2/f6741/16 p> p> où code> clause filtre les données de la source avant agrégés, tandis que
ayant code> filtre filtre des données après le groupe
par code> 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
où code> clause.
id> 2 code>. Si vous mettez cela dans un
ayant code> Clause, vous obtiendrez un < Strong> Erreur forte> , car la colonne
ID CODE> n'est pas disponible Post Agrégate car il ne figure pas dans la clause
SELECT CODE>. Dans ce cas, vous seriez obligé d'utiliser un
où la clause code> à la place: p>
Voir aussi: SQL - avoir vs où ; où vs ayant