92
CHAPITRE 4. LANGAGE SQL
La clause HAVING
De la même façon qu’il est possible de sélectionner certaines lignes au moyen de la clause WHERE, il
est possible, dans un SELECT comportant une fonction de groupe, de sélectionner certains groupes par
la clause HAVING. Celle-ci se place après la clause GROUP BY.
Le prédicat dans la clause HAVING suit les mêmes règles de syntaxe qu’un prédicat figurant dans une
clause WHERE. Cependant, il ne peut porter que sur des caractéristiques du groupe : fonction d’agrégation
ou expression figurant dans la clause GROUP BY.
Une requête de groupe (i.e. comportant une clause GROUP BY) peut contenir à la fois une clause
WHERE et une clause HAVING. La clause WHERE sera d’abord appliquée pour sélectionner les lignes, puis
les groupes seront constitués à partir des lignes sélectionnées, les fonctions de groupe seront ensuite
évaluées et la clause HAVING sera enfin appliquée pour sélectionner les groupes.
Exemples
Pour connaître le nombre de fois que chacun des films a été projeté en ne s’intéressant qu’aux films
projetés plus de 2 fois, on utilise la requête :
SELECT num_film, titre, COUNT(*)
FROM film NATURAL JOIN projection
GROUP BY num_film, titre HAVING COUNT(*)>2;
Si en plus, on ne s’intéresse qu’aux films projetés au cinéma Le Fontenelle, il faut ajouter une clause
WHERE :
SELECT num_film, titre, COUNT(*)
FROM film NATURAL JOIN projection NATURAL JOIN cinema
WHERE cinema.nom = ’Le Fontenelle’
GROUP BY num_film, titre HAVING COUNT(*)>2;
4.7.3 Opérateurs ensemblistes : UNION, INTERSECT et EXCEPT
Les résultats de deux requêtes peuvent être combinés en utilisant les opérateurs ensemblistes d’union
(UNION), d’intersection (INTERSECT) et de différence (EXCEPT). La syntaxe d’une telle requête est la suivante :
requête_1 { UNION | INTERSECT | EXCEPT } [ALL] requête_2 [...]
Pour que l’opération ensembliste soit possible, il faut que requête_1 et requête_2 aient le même
schéma, c’est à dire le même nombre de colonnes respectivement du même type. Les noms de colonnes
(titres) sont ceux de la