Différence entre HAVING et WHERE
Les clauses WHERE et HAVING sont principalement utilisées dans des requêtes SQL, elles permettent de limiter une résultat en utilisant un prédicat spécifique. La principale différence entre WHERE et HAVING est que la clause WHERE spécifie les conditions de sélection des tuples (lignes) dans les tables, y compris les conditions de jointure si nécessaire. En revanche, la clause HAVING spécifie une condition sur les groupes sélectionnés plutôt que sur des tuples individuels.
SQL signifie Structured Query Language; c’est un langage de base de données complet ou déclaratif utilisé pour accéder aux données des bases de données.
Table de comparaison
WHERE | HAVING | |
---|---|---|
Implémentation | Implémenté dans les opérations de ligne. | Implémenté dans les opérations de colonne. |
Fonctions d’agrégat(MAX(), MIN(), AVG() …) | Ne peut pas apparaître dans la clause WHERE. | Peut apparaître dans la clause HAVING. |
Utilisé avec | SELECT et d’autres instructions telles que UPDATE, DELETE | Utilisé que avec l’instruction SELECT. |
Fonctionne comme | Pré-filtre | Post-filtre |
GROUP BY | Vient après WHERE. | Vient avant HAVING. |
Récupération de données | Il récupère uniquement les données d’une ligne particulière en fonction d’une condition. | Au début, les données complètes sont récupérées puis il en sépare en fonction de la condition. |
Définition de la clause WHERE
La clause WHERE de SQL est utilisée pour décrire une condition au moment de la récupération des données à partir d’une seule table ou en joignant plusieurs tables. Il ne renvoie que la valeur particulière de la table si la condition donnée est remplie. La clause WHERE est utilisée pour imprégner les enregistrements et extraire uniquement les enregistrements nécessaires.
Prenons un exemple. Le tableau ci-dessous nommé « Employé » se compose des attributs « Nom« , « Prénom » et « Salaire« .
La requête suivante doit être écrite pour calculer le salaire total de Bob et Ali.
SELECT Prenom, SUM(Salaire) AS Salaire_Total FROM Employee WHERE Prenom in ('Bob', 'Ali') GROUP BY Prenom;
La sortie suivante est la sortie résultante où les lignes sont filtrées en premier, les lignes de Ali et de Bob sont extraites, puis la fonction d’agrégation est exécutée.
Définition de la clause HAVING
SQL fournit la clause HAVING qui peut être utilisée conjointement avec la clause GROUP BY. La clause HAVING aide à récupérer les valeurs pour les groupes qui remplissent certaines conditions. La clause WHERE peut également être utilisée avec la clause HAVING lors de la sélection, la clause WHERE filtre une ligne individuellement. Les lignes sont ensuite regroupées et le calcul d’agrégat sera effectué.
Il se comporte comme WHERE lorsque le mot-clé GROUP BY n’est pas utilisé. Les fonctions de groupe telles que min, max, avg, sum et count ne peuvent apparaître que dans deux clauses: SELECT et HAVING. Il fournit une condition sur les tuples correspondant à chaque valeur du groupe d’attributs. Le seul ensemble d’enregistrements satisfaisant à la condition sera affiché comme résultat.
Nous prenons le même exemple que la clause WHERE et considérons la même table « Employé« . Lorsque nous voulons calculer le salaire total de Bob et Ali à l’aide de la clause HAVING, nous allons écrire la requête suivante.
SELECT Prenom, SUM(Salaire) AS Salaire_Total FROM Employee GROUP BY Prenom HAVING Prenom in ('Bob', 'Ali');
La requête génère la sortie suivante dans laquelle les prénoms sont extraits en premier, puis la fonction d’agrégat (somme) est exécutée et, au final, les groupes sont filtrés contrairement à la clause WHERE.
Différences clés entre la clause HAVING et WHERE
- La clause WHERE est utilisée dans les opérations de ligne et appliquée sur une seule ligne, tandis que la clause HAVING est utilisée dans les opérations de colonne et peut être appliquée aux lignes ou aux groupes résumés.
- Dans la clause WHERE, les données souhaitées sont extraites en fonction de la condition appliquée. En revanche, la clause HAVING récupère des données entières, puis la séparation est effectuée en fonction de la condition.
- Les fonctions d’agrégation telles que min, sum, max, avg ne peuvent jamais apparaître avec la clause WHERE. Par contre, ces fonctions peuvent apparaître dans la clause HAVING.
- La clause HAVING ne peut pas être utilisée sans l’instruction SELECT. Inversement, WHERE peut être utilisé avec SELECT, UPDATE, DELETE, etc.
- La clause WHERE se comporte comme un pré-filtre tandis que la clause HAVING agit comme un post-filtre.
- La clause WHERE, lorsqu’elle est utilisée avec GROUP BY, est placé avant GROUP BY. Cela signifie que WHERE filtre les lignes avant que les calculs d’agrégation ne soient effectués. Tandis que, HAVING vient après GROUP BY, ce qui signifie qu’il filtre une fois les calculs d’agrégat effectués.
Conclusion
La clause WHERE et HAVING fonctionne de la même manière, juste, La clause HAVING peut fonctionner efficacement avec les fonctions d’agrégation alors que WHERE ne peut pas être exploité avec les fonctions d’agrégat.