Filtrage des données SQL : différences entre les clauses WHERE et HAVING
Les clauses HAVING et WHERE dans SQL sont toutes deux utilisées pour filtrer les données, mais leurs fonctions sont différentes. La clause WHERE fonctionne sur des lignes individuelles, tandis que la clause HAVING fonctionne sur des résultats agrégés.
Exemple de différence
Supposons que nous ayons deux tables : Lecturers
et Lecturers_Specialization
, et que nous souhaitions trouver les conférenciers possédant le plus de domaines d'expertise.
La requête initiale utilisant la clause WHERE ne donne pas les résultats attendus :
<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>
En effet, la clause WHERE filtre une seule ligne et la comparaison COUNT(S.Expertise) >= ALL
ne peut pas être appliquée à une seule ligne.
La requête correcte utilise 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>
HAVING agit sur les résultats agrégés pour garantir que la comparaison s'applique au nombre de domaines d'expertise de chaque instructeur.
Règles empiriques et optimisation
De manière générale, la clause WHERE est utilisée avant la clause GROUP BY pour filtrer les lignes individuelles ; la clause HAVING est utilisée après la clause GROUP BY pour filtrer les résultats agrégés.
De plus, les requêtes peuvent être optimisées à l'aide de la syntaxe ANSI JOIN au lieu de la syntaxe de jointure L, S θ :
<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>
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!