Comprendre les clauses WHERE et HAVING dans les requêtes SQL
Les développeurs SQL sont souvent confrontés au défi de faire la distinction entre les clauses WHERE et HAVING. Cet article vise à clarifier leurs différentes utilisations dans les requêtes SQL.
Quand utiliser OÙ
Quand utiliser HAVING
Exemple : Maître de conférences avec le plus de spécialisations
Pour illustrer cette différence, considérons le tableau suivant :
<code>1. Lecturers (LectID, Fname, Lname, degree) 2. Lecturers_Specialization (LectID, Expertise)</code>
Le but est de trouver le moniteur avec le plus de spécialisations.
Requête WHERE (erreur)
<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 WHERE ne fonctionne pas car elle tente d'utiliser WHERE pour filtrer en fonction d'une fonction d'agrégation (COUNT(S.Expertise)). La clause WHERE est utilisée pour filtrer les lignes individuelles, et non pour agréger les résultats.
HAVING requête (correct)
<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>
Cette requête HAVING récupère avec succès les résultats corrects car elle définit des conditions sur les données agrégées (COUNT(S.Expertise)) après l'opération GROUP BY.
Version connexion ANSI (recommandée)
En utilisant la syntaxe de jointure ANSI, la requête peut être réécrite comme :
<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 la clause WHERE pour les conditions de jointure thêta, ce qui entraîne des requêtes plus efficaces et conformes aux normes.
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!