Maison > base de données > tutoriel mysql > OÙ ou HAVING en SQL : quand dois-je utiliser chaque clause ?

OÙ ou HAVING en SQL : quand dois-je utiliser chaque clause ?

DDD
Libérer: 2025-01-21 09:36:39
original
204 Les gens l'ont consulté

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

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Ù

  • Filtrage de lignes individuelles : La clause WHERE est utilisée pour imposer des conditions sur des lignes individuelles dans une table ou pour joindre un ensemble de résultats. Il évalue chaque ligne et sélectionne uniquement celles qui répondent aux critères spécifiés.

Quand utiliser HAVING

  • Filtrer les résultats agrégés : La clause HAVING applique une condition à un groupe de lignes représenté par une fonction d'agrégation (telle que COUNT(), SUM(), AVG()). Utilisez-le lorsque vous devez définir des conditions sur les données résumées après une opération d'agrégation.

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

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

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

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

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal