108
Chapitre 5 • Le langage SQL DML
regroupés par localité, le nom de celle-ci, le nombre de clients dans le groupe et le
montant moyen des comptes des clients du groupe.
select LOCALITE,
count(*) as NOMBRE_CLIENTS,
avg(COMPTE) as MOYENNE_COMPTE
from
CLIENT
group by LOCALITE
Le résultat compte autant de lignes qu’il y a de groupes ainsi constitués, et donc
autant qu’il y a de localités distinctes dans CLIENT :
Nous avons donc interrogé les localités plutôt que les clients. Le mécanisme qui
extrait les informations sur les localités à partir des informations sur les clients est
invoqué par la clause group by.
On ne peut trouver dans la clause select que des éléments (colonnes, expression
de calcul, fonction agrégatives) définissant une seule valeur par groupe. On n’aurait
donc pu y spécifier ni NOM ni CAT. Intuitivement, on ne peut demander à un groupe
que des informations communes à tous ses membres : des composants du critère de
groupement, des fonctions agrégatives et bien sûr des constantes 36 .
5.5.2 Sélection de groupes et sélection de lignes
Des conditions de sélection peuvent être imposées aux groupes à sélectionner. Elles
seront exprimées dans une clause having, ce qui évite toute confusion avec la
clause where qui, elle, s’applique aux lignes. Dans la requête ci-dessous, on ne
retient par exemple que les groupes d’au moins trois clients :
select LOCALITE, count(*), avg(COMPTE)
from
CLIENT
group by LOCALITE
having count (*) >= 3
ce qui donne :
35. Les grouper selon leur numéro NCLI constituerait des groupes d’une seule personne, ce qui
n’aurait guère d’intérêt.
LOCALITE
NOMBRE_CLIENTS MOYENNE_COMPTE
Poitiers
Namur
Geneve
Lille
Toulouse
Paris
Bruxelles
3
4
1
1
5
1
1
533.33
-2520.00
0.00
720.00
-2530.00
0.00
0.00
36. Lorsqu’on interroge un groupe, tous ses membres doivent répondre d’une même voix.
Chapitre 5 • Le langage SQL DML
regroupés par localité, le nom de celle-ci, le nombre de clients dans le groupe et le
montant moyen des comptes des clients du groupe.
select LOCALITE,
count(*) as NOMBRE_CLIENTS,
avg(COMPTE) as MOYENNE_COMPTE
from
CLIENT
group by LOCALITE
Le résultat compte autant de lignes qu’il y a de groupes ainsi constitués, et donc
autant qu’il y a de localités distinctes dans CLIENT :
Nous avons donc interrogé les localités plutôt que les clients. Le mécanisme qui
extrait les informations sur les localités à partir des informations sur les clients est
invoqué par la clause group by.
On ne peut trouver dans la clause select que des éléments (colonnes, expression
de calcul, fonction agrégatives) définissant une seule valeur par groupe. On n’aurait
donc pu y spécifier ni NOM ni CAT. Intuitivement, on ne peut demander à un groupe
que des informations communes à tous ses membres : des composants du critère de
groupement, des fonctions agrégatives et bien sûr des constantes 36 .
5.5.2 Sélection de groupes et sélection de lignes
Des conditions de sélection peuvent être imposées aux groupes à sélectionner. Elles
seront exprimées dans une clause having, ce qui évite toute confusion avec la
clause where qui, elle, s’applique aux lignes. Dans la requête ci-dessous, on ne
retient par exemple que les groupes d’au moins trois clients :
select LOCALITE, count(*), avg(COMPTE)
from
CLIENT
group by LOCALITE
having count (*) >= 3
ce qui donne :
35. Les grouper selon leur numéro NCLI constituerait des groupes d’une seule personne, ce qui
n’aurait guère d’intérêt.
LOCALITE
NOMBRE_CLIENTS MOYENNE_COMPTE
Poitiers
Namur
Geneve
Lille
Toulouse
Paris
Bruxelles
3
4
1
1
5
1
1
533.33
-2520.00
0.00
720.00
-2530.00
0.00
0.00
36. Lorsqu’on interroge un groupe, tous ses membres doivent répondre d’une même voix.
