Maison >base de données >tutoriel mysql >HAVING vs WHERE en SQL : quand dois-je utiliser chaque clause pour l'agrégation ?
Différences entre les clauses HAVING et WHERE dans les requêtes d'agrégation SQL
Comprendre la différence entre les clauses HAVING et WHERE est crucial lorsque l'on travaille avec des données agrégées. Cet article plongera dans un scénario de requête courant et expliquera pourquoi une méthode renvoie les résultats corrects et une autre non.
Contexte de requête
Compte tenu du tableau suivant :
Le but est de trouver le moniteur avec le plus de spécialités.
Échec de la tentative d'utilisation de la clause WHERE
Échec des tentatives de requête pour utiliser la clause WHERE pour filtrer les résultats en fonction du nombre de majors :
<code class="language-sql">SELECT L.LectID, Fname, Lname FROM Lecturers L, Lecturers_Specialization S WHERE L.LectID = S.LectID AND COUNT(S.Expertise) >= ALL (SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID);</code>
Cette requête n'a pas réussi à produire les résultats attendus car la clause WHERE n'est pas adaptée pour appliquer des conditions sur des valeurs agrégées.
Requête réussie à l'aide de la clause HAVING
Les requêtes réussies utilisent plutôt la clause HAVING :
<code class="language-sql">SELECT L.LectID, Fname, Lname FROM Lecturers L, Lecturers_Specialization S WHERE L.LectID = S.LectID GROUP BY L.LectID, Fname, Lname HAVING COUNT(S.Expertise) >= ALL (SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID);</code>
Les raisons pour lesquelles AVOIR réussit
La clause HAVING est spécifiquement utilisée pour filtrer les résultats des requêtes agrégées. Il applique une condition après l'opération GROUP BY, permettant de vérifier le nombre de majeures pour chaque instructeur.
Règle générale
De manière générale, utilisez WHERE avant GROUP BY pour filtrer les lignes individuelles et utilisez HAVING après GROUP BY pour filtrer les résultats agrégés.
Requête améliorée utilisant ANSI JOIN
Une version alternative de requête utilisant la syntaxe ANSI JOIN est également fournie :
<code class="language-sql">SELECT L.LectID, Fname, Lname FROM Lecturers L JOIN Lecturers_Specialization S ON L.LectID=S.LectID GROUP BY L.LectID, Fname, Lname HAVING COUNT(S.Expertise)>=ALL (SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID)</code>
Cette version élimine l'utilisation de WHERE pour les conditions de jointure et utilise JOIN à la place.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!