Maison > base de données > tutoriel mysql > SQL HAVING vs WHERE : quand utiliser chaque clause pour le filtrage des données ?

SQL HAVING vs WHERE : quand utiliser chaque clause pour le filtrage des données ?

Linda Hamilton
Libérer: 2025-01-21 09:56:09
original
984 Les gens l'ont consulté

SQL HAVING vs. WHERE: When to Use Each Clause for Data Filtering?

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>
Copier après la connexion

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>
Copier après la connexion
La clause

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal