Maison >base de données >tutoriel mysql >HAVING vs WHERE en SQL : quand dois-je utiliser chaque clause pour l'agrégation ?

HAVING vs WHERE en SQL : quand dois-je utiliser chaque clause pour l'agrégation ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-21 09:53:09398parcourir

HAVING vs. WHERE in SQL: When Should I Use Each Clause for Aggregation?

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 :

  • Conférenciers (Colonnes : LectID, Fname, Lname, diplôme)
  • Lecturers_Specialization (Colonnes : LectID, Expertise)

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn