Vous êtes sur la page 1sur 16

1

Exercice n° 53
Description
Public(s) Section de Terminale STT informatique de gestion
Savoir(s) 3.2.2 Le(s) langage(s) de manipulation de données
Capacité(s) Être capable de :
– écrire une requête SQL avec la fonction de calcul « compte »
– écrire une requête SQL avec la fonction de calcul « compte » sur
un regroupement
Objectif(s) Présenter la fonction de calcul « compte » par l’exemple et mettre en
application cette nouvelle notion
Fichier Exonet53.zip
Auteur(s) Séverine QUESQUE

Énoncé
Contexte de travail
LOCAFLOT est une société de location d’embarcations de différents types : des
barques (avec rames !), des jets-skis, des bateaux à moteur et des pédalos. Ces
embarcations sont louées par demi-heure, à l’heure, par demi-journée ou à la
journée.
Pierrot VAGUE gère ces locations grâce à un système de gestion de base de
données relationnelles. Ainsi, lorsqu’un client se présente, il interroge sa base de
données pour consulter immédiatement les embarcations disponibles, les retards,
etc. Mais, dans certains cas, les informations nécessaires ne se trouvent pas
clairement dans la base de données : par exemple, un client, responsable d’un
centre aéré, lui a demandé ce matin s’il était possible de louer 3 pédalos doubles et 2
pédalos toboggans pour la journée. Pierrot a fait des requêtes et a compté le nombre
de pédalos qui apparaissaient à l’écran : heureusement qu’il n’y avait pas 100
lignes !
Pierrot ne savait pas qu’il avait la possibilité de faire une requête pour afficher
directement le nombre qu’il recherchait. Vous allez l’aider …

Travail à Réaliser
Question 1 :

Répondez aux questions suivantes en justifiant chacune de vos réponses par un


exemple observable dans les annexes 1 ou 2 :

– Une location peut-elle concerner plusieurs embarcations ?

– Le nombre de personnes montant dans une embarcation louée correspond-il


toujours au nombre de places de l’embarcation ?

– Une embarcation correspond-elle toujours à un seul type d’embarcation ?

– La couleur de l’embarcation dépend-elle du type d’embarcation ?

– Quel attribut permet de savoir si une embarcation peut être louée ?

CERTA DIJON
2
Question 2 :

En regardant le contenu des tables proposées en annexe 2, trouvez le nombre


d’embarcations blanches. Quelle table utilisez-vous pour obtenir le résultat ?

Le nombre d’embarcations blanches est l’information recherchée. Est-ce qu’on peut


lire directement cette information dans une table existante ?

Parmi les propositions suivantes, lesquelles correspondent à votre façon d’obtenir le


résultat ?
– Additionner les numéros d’embarcation.
– Compter le nombre de lignes pour lesquelles la couleur est « blanc ».
– Additionner les couleurs.
– Compter le nombre de lignes de la table.
– Compter les numéros des embarcations blanches.

La question posée (obtenir le nombre d’embarcations blanches) demande une


information qui n’est pas stockée dans la table mais qui peut être obtenue grâce à
un calcul. Ce calcul consiste à compter, dans la table, le nombre des lignes qui
répondent au critère retenu.

La requête qui permet d’obtenir « Le nombre d’embarcations blanches » en


SQL s’écrit de la façon suivante :

SELECT count(numembarcation)
FROM embarcation
WHERE couleur = “blanc”;

Question 3 :

En analysant cette requête, indiquez quelle fonction de calcul SQL permet de


compter.

Question 4

Application : pour chaque ligne du tableau présenté ci-dessous, complétez la ou les


partie(s) vide(s), en vous servant des annexes.

Énoncé de la requête Requête SQL Résultat


Le nombre d’embarcations 9
de couleur jaune
Le nombre total 38
d’embarcations
Le nombre de pédalos
toboggans disponibles
SELECT count(numembarcation) 20
FROM typembarcation, embarcation
WHERE typenbarcation.codetype =
embarcation.codetype
AND nbplace > 2 ;

Conclusion : Quand utiliser une fonction de calcul ? Quel calcul ?

CERTA DIJON
3
Question 5 :

En analysant le contenu des tables de l’annexe 2, trouvez le nombre d’embarcations


par type d’embarcation.

Quelle table utilisez-vous pour obtenir le résultat ?

Combien de lignes obtenez-vous dans la table résultat ? Combien de colonnes ?

Le nombre d’embarcations par type est l’information recherchée. Est-ce qu’on peut
lire directement cette information dans une table existante ?

Parmi les propositions suivantes, lesquelles correspondent à votre façon d’obtenir le


résultat ?
– Regrouper les lignes par code type et compter le nombre d’embarcations
correspondantes.
– Additionner les numéros d’embarcation.
– Compter les types.
– Compter le nombre d’embarcations par code type.
– Compter le nombre de lignes de la table.

La question posée (obtenir le nombre d’embarcations par type d’embarcation) peut


être obtenue grâce à la fonction de comptage « count » . Mais ce calcul ne se fait
pas globalement sur toute la table, représentant l’ensemble du groupe : il faut faire le
comptage par type d’embarcation, autrement dit effectuer le calcul sur des sous-
groupes. Il est donc nécessaire d’utiliser une clause supplémentaire dans
l’instruction SQL SELECT...

La requête SQL qui donne le nombre d’embarcations par type d’embarcation


s’écrit de la façon suivante :

SELECT codetype, count(numembarcation)


FROM EMBARCATION
GROUP BY codetype;

Question 6 :

Dans cette requête, quelle nouvelle clause apparaît dans l’instruction SQL SELECT?

En vous aidant des questions posées au point 5, expliquez à quoi sert cette clause.

Question 7

Application : complétez le tableau suivant :

Énoncé de la requête Requête SQL Résultat

Le nombre
d’embarcations par
couleur

CERTA DIJON
4

Le nombre Barque 5
d’embarcations par nom bateau à moteur 3
de type d’embarcation jet ski 5
pédalo double 8
pédalo simple 10
pédalo toboggan 7

Le nombre Extrait de la table résultat


d’embarcations louées Date Nb emb
par journée 29/08/00 3
30/08/00 3
31/08/00 5
01/09/00 5

SELECT LOUER.numlocation, date, 1


count(numembarcation)
FROM LOUER, LOCATION 1
WHERE LOUER.numlocation = 2 29/08/00 1
LOCATION.numlocation 3 29/08/00 1
GROUP BY LOUER.numlocation, 4 30/08/00 2
date ; 5 30/08/00 1
6 31/08/00 2
Rappel : 7 31/08/00 3
8 01/09/00 1
Deux attributs portent le nom 9 01/09/00 1
“numlocation”. L’un se trouve 10 01/09/00 1
dans la table LOUER, l’autre 11 01/09/00 1
dans la table LOCATION et 12 01/09/00 1
ces deux tables sont utilisées
dans la requête : pour
désigner sans ambiguïté
l’attribut demandé, il faut
préfixer son nom par le nom
de la table à laquelle il
appartient.

Conclusion : Dans quel cas faire un calcul avec un regroupement ? Quelle est la
syntaxe à respecter en SQL ?

Exercice d’application

Écrire les requêtes SQL qui permettent de répondre aux questions suivantes :
1. Le nombre d’embarcations disponibles dont le tarif horaire est inférieur à 100
FFR.
2. Le nombre de locations réalisées par journée.
3. Le nombre d’embarcations de type « jet-ski » à une place.
4. La quantité d’embarcations disponibles possédant 2 places au maximum, par

CERTA DIJON
5

type d’embarcation. La requête doit afficher le nom du type d’embarcation, le


prix de la location à la demi-heure et le nombre d’embarcations disponibles.
5. Le nombre d’embarcations par type (nom) avec pour chaque type, le nombre
de places. Le résultat sera présenté par ordre croissant du nombre
d’embarcations.

Annexes

Annexe 1 : Schéma relationnel graphique

CERTA DIJON
6
ANNEXE 2 : Extraits des tables
Table « embarcation »
numembarcation couleur disponible codetype P107 bleu Oui P1
B101 vert Oui B1 P108 jaune Non P1
B102 blanc Oui B1 P109 rouge Oui P1
B103 jaune Non B1 P110 jaune Oui P1
B201 blanc Non B2 P201 rouge Non P2
B202 rouge Oui B2 P202 jaune Oui P2
J101 multicolore Oui J1 P203 blanc Non P2
J102 blanc Non J1 P204 blanc Oui P2
J103 blanc Oui J1 P205 bleu Oui P2
J201 jaune Non J2 P206 violet Non P2
J202 blanc Oui J2 P207 blanc Oui P2
M101 jaune Oui M1 P208 jaune Oui P2
M102 blanc Non M1 P301 blanc Non P3
M103 blanc Non M1 P302 rouge Oui P3
P101 blanc Oui P1 P303 rouge Non P3
P102 blanc Oui P1 P304 jaune Oui P3
P103 jaune Non P1 P305 bleu Oui P3
P104 bleu Oui P1 P306 bleu Non P3
P105 rouge Non P1 P307 bleu Non P3
P106 blanc Oui P1

Table « typembarcation »
codetype nomtype nbplace prix demi-heure prix heure prix demi-journée prix journée
B1 barque 2 15 25 80 150
B2 barque 4 30 50 140 200
J1 jet-ski 1 80 150 300 500
J2 jet-ski 2 120 250 400 700
M1 bateau à moteur 4 100 200 400 800
P1 pédalo simple 2 30 55 150 250
P2 pédalo double 4 40 75 170 280
P3 pédalo toboggan 6 45 80 180 300

Extrait de la table « location » Extrait de la table « louer »


numlocation date heuredébut heurefin
1 29/08/00 10:00 10:30 numlocation numembarcation nbpersonnes
1 P101 1
2 29/08/00 10:05 10:35
3 29/08/00 10:02 11:02 2 P106 2
4 30/08/00 10:30 18:00 3 P102 2
5 30/08/00 10:45 11:15 4 J202 1
4 M101 2
6 31/08/00 11:30 12:30
7 31/08/00 11:45 12:15 5 B101 3
6 P207 1
8 01/09/00 13:30 14:00
9 01/09/00 13:32 14:02 6 P208 1
7 P302 2
10 01/09/00 13:40 14:40
11 01/09/00 13:45 14:00 7 P304 2
7 P305 2
12 01/09/00 13:47 18:00
8 P106 1
9 P102 1
10 P110 2
11 J201 1
12 J103 1

CERTA DIJON
7

Correction

Prérequis : requêtes SQL avec opérateurs projection, sélection et jointure (tri : facultatif).

L’exercice est décomposé de la façon suivante :


1. Découverte de la fonction SQL « count »
prise de conscience de la nécessité d’utiliser une fonction (questions 1 et 2)
présentation d’une requête utilisant cette fonction (question 3)
application à d’autres requêtes (question 4)
conclusion : synthèse sur la fonction « count »
2. Découverte de la clause d’instruction SQL « group by »
prise de conscience de la nécessité d’une clause supplémentaire (question 5)
présentation d’une requête utilisant cette nouvelle clause (question 6)
application à d’autres requêtes (question 7)
conclusion : synthèse sur la clause « group by » et sur la fonction « count »
3. Exercice d’application

L’objectif de l’exercice est de faire prendre conscience de la nécessité dans certains


cas d’utiliser une fonction de calcul. On donne ensuite un exemple de requête
utilisant la fonction. Enfin l’élève applique la notion à d’autres exemples.

Les questions posées aux points 2 et 5 doivent être réutilisées par les élèves
ensuite :
– pour déterminer si le résultat est obtenu grâce à un calcul (sur quelle table),
– pour déterminer l’opération à appliquer (ne pas confondre compter 1 et
additionner – cf. cases à cocher –),
– pour savoir s’il faut faire un regroupement ou non.



– Question 1 :

– À partir des annexes 1 et 2, répondre aux questions suivantes en
justifiant par un exemple :

– Cette question a pour objectif de faire découvrir aux élèves la structure et le
contenu de la base de données.
– Une location peut-elle concerner plusieurs embarcations ?
– Oui. Par exemple, la location n° 4 concerne l’embarcation J202 et
l’embarcation M101.
– Le nombre de personnes montant dans une embarcation louée correspond-
elle toujours au nombre de places de l’embarcation ?
– Non. Par exemple, pour la location n° 1 qui concerne l’embarcation P101, de
type P1, le nombre maximum de places est de 2 et le nombre de personnes
montant dans l’embarcation est de 1.
– Une embarcation correspond-elle toujours à un seul type d’embarcation ?

1
Le professeur peut utiliser le verbe « dénombrer » à la place de « compter » et le substantif
« dénombrement » à la place de « comptage ». Ce sont des termes plus précis d’un point de vue
mathématique mais il n’est pas certain qu’ils soient bien compris par les élèves.

CERTA DIJON
8
– Oui. C’est ce que révèle la structure de la table « embarcation » : à une
embarcation, correspond un et un seul type. Chaque ligne de la table
« embarcation » peut donc servir d’exemple.
– La couleur de l’embarcation dépend-elle du type d’embarcation ?
– Non, puisqu’il y a une couleur par embarcation (contre-exemple : pour le type
B1, on trouvera des embarcations vertes, blanches, jaunes, ...)
– Quel attribut permet de savoir si une embarcation peut être louée ?
– C’est l’attribut « disponible », de type booléen. L’embarcation B101 peut être
louée, l’embarcation B103 non.

– Question 2 :

– En regardant le contenu des tables, trouvez le nombre d’embarcations
blanches.

– Les élèves en sont réduits à compter « manuellement » dans la table
« embarcation » : il y a 14 embarcations blanches.

– Quelle table utilisez-vous pour obtenir le résultat ?

– Les élèves constatent qu’ils obtiennent le résultat précédent à partir de
la table « embarcation ».

– Le nombre d’embarcations blanches est l’information recherchée. Est-ce
qu’on peut lire directement cette information dans une table existante ?

– Non, l’information demandée ne se trouve pas directement dans une
table mais elle peut être obtenue grâce à un calcul.

– Parmi les propositions suivantes, lesquelles correspondent à votre façon
d’obtenir le résultat ?
– Compter le nombre de lignes pour lesquelles la couleur est « blanc ».
– Compter les numéros des embarcations blanches.

– Question 3 :

– Indiquez quelle fonction de calcul SQL permet de compter :

– Les élèves analysent la requête SQL et, sachant que le résultat de cette
requête est le nombre d’embarcations blanches (14, résultat trouvé précédemment),
ils en concluent que la fonction « count » permet de compter.

– Conclusion : A compléter avec les élèves après la partie découverte ou
après la partie application.

– Dans certains cas, l’information à obtenir ne correspond pas directement à un
champ d’une table mais résulte d’un calcul sur une colonne. Dans ce cas, il faut
utiliser une fonction de calcul. Si l’information à obtenir correspond à un comptage, la

CERTA DIJON
9
fonction de calcul SQL est « count ». Les autres critères de sélection, projection,
jointure restent identiques.

– Question 4 : Application : complétez le tableau suivant



– – Résultat–
– Énoncé de la requête – Requête SQLpar rapport au
contenu des
tables
– SELECT count(numembarcation) –
– Le nombre d’embarcations de
couleur jaune – FROM embarcation – 9
– WHERE couleur = "jaune" ;
– –
– SELECT count(numembarcation) –
– Le nombre total d’embarcations
– FROM embarcation ; – 38

– –
– Le nombre de « pédalos – SELECT count(numembarcation) –
toboggans » disponibles – FROM embarcation, typembarcation – 3
– R/ Il est conseillé de chercher
d’abord le résultat afin de repérer les tables
– WHERE embarcation.codetype
à utiliser et les opérations à faire = typembarcation.codetype
– AND nomtype= "pédalo toboggan"
– AND disponible= "Oui";
– SELECT count(numembarcation) –
– FROM typembarcation, embarcation –
– Le nombre d’embarcations
qui offrent une capacité supérieure à 2 – WHERE typenbarcation.codetype = – 20
places. embarcation.codetype
AND nbplace > 2 ;

– Question 5 :

– En analysant le contenu des tables, trouvez le nombre d’embarcations par
type d’embarcation

– –
– –
– –
– –
– –
1
– –
– –
– –

– Quelle table utilisez-vous pour obtenir le résultat ?

– Les élèves constatent qu’ils obtiennent le résultat précédent à partir de la table
embarcation.

CERTA DIJON
10

CERTA DIJON
11
– Combien de lignes obtenez-vous dans la table résultat ? Combien de
colonnes ?
– La table résultat comporte 8 lignes : 1 ligne par type d’embarcation.
– La table résultat comporte 2 colonnes.
– R/ faire remarquer à l’élève que, précédemment, nous obtenions un seul
résultat par requête.(une seule ligne / une seule colonne)

– Le nombre d’embarcations par type est l’information recherchée. Est-ce
qu’on peut lire directement cette information dans une table existante ?

– Non, l’information demandée ne se trouve pas directement dans la table mais
elle peut être obtenue grâce à un calcul.

– Parmi les propositions suivantes, lesquelles correspondent à votre
façon d’obtenir le résultat ?

– Regrouper les lignes par code type et compter le nombre d’embarcations
correspondantes.
– Compter le nombre d’embarcations par code type.

– Question 6 :

– Dans cette requête, quelle nouvelle clause apparaît dans l’instruction
SQL SELECT ?

– La nouvelle clause SQL est « group by ».

– En vous aidant des questions posées au point 5, expliquez à quoi sert cette
clause.
– Le résultat recherché nécessite d’opérer un regroupement par type
d’embarcation, ce que permet la clause « group by codetype ».

– Conclusion : A compléter avec les élèves après la partie découverte ou
après la partie application.

– Lorsqu’un calcul doit être fait en regroupant d’abord des informations, puis en
effectuant le calcul sur chacun des groupes obtenus, il faut utiliser la clause SQL
« group by ».
– Le regroupement se fait obligatoirement sur tous les champs projetés (sauf la
fonction de calcul) : « Tous les champs du « group by » se trouvent dans le
« select ».
– La clause « group by » est inutile dans le cas où :
– il n’y a pas de fonction de calcul utilisée,
– un seul résultat est attendu.
– Une seule valeur résultat (ex : 14) à pas de « group by »

– Plusieurs valeurs avec un ou plusieurs champs correspondants (ex : b3, 1)
à group by

CERTA DIJON
12

– Question 7 : Application : complétez le tableau suivant :



– – – Résultat par
– Énoncé de la requête – Requête SQL rapport au
contenu des
tables
– –
– – couleur
– Le nombre d’embarcations
par couleur – SELECT couleur, nb emb
count(numembarcation) –
– FROM embarcation – blanc 14
– GROUP BY couleur ; –
– bleu 6

– jaune 9

– multicolore
1

– rouge 6

– vert 1

– violet 1


– –
– – barque 5
– Le nombre d’embarcations
par nom de type d’embarcation – SELECT nomtype, –
count(numembarcation) – bateau à
– FROM embarcation, moteur 3
typembarcation –
– GROUP BY nomtype ; – jet ski 5

– pédalo
double 8

– pédalo
simple 10

– pédalo
toboggan 7


– –
– Extrait de la table
– résultat
– Le nombre d’embarcations
louées par journée – SELECT date, –
count(numembarcation) – date Nb
– FROM louer emb

CERTA DIJON
13

– GROUP BY date ; – 29/08/00 3



– 30/08/00 3

– 31/08/00 5

– 01/09/00 5
– –
– 1
– SELECT LOUER.numlocation, date, 29/08/00 1
– Le nombre count(numembarcation) –
d’embarcations louées – FROM LOUER, LOCATION – 2
29/08/00 1
par location, avec la – WHERE LOUER.numlocation = –
date de location LOCATION.numlocation – 3
correspondante. – GROUP BY LOUER.numlocation, date ;
29/08/00 1

– – 4
30/08/00 2
– R/ Cette requête – Rappel : –
permet d’illustrer que le – Deux attributs portent le nom “numlocation”. L’un se – 5
regroupement se fait sur trouve dans la table LOUER, l’autre dans la table
30/08/00 1

tous les champs –


LOCATION et ces deux tables sont utilisées dans la – 6
projetés requête : pour désigner sans ambiguïté l’attribut demandé, 31/08/00 2

il faut préfixer son nom par le nom de la table à laquelle il –


– 7
appartient. 31/08/00 3

– 8
01/09/00 1

– 9
01/09/00 1

– 10
01/09/00 1

– 11
01/09/00 1

– 12
01/09/00 1



CERTA DIJON
14

– Exercice d’application : Écrire les requêtes SQL qui permettent de répondre


aux questions suivantes :

– On peut demander aussi le résultat attendu pour chaque requête. Ceci est intéressant si les élèves
le font avant d’écrire leur requête afin d’analyser la démarche qu’ils appliquent pour obtenir le résultat ou
s’ils veulent valider la requête qu’ils ont écrite, se réservant donc la possibilité de la corriger.


1. Le nombre d’embarcations disponibles dont le tarif horaire est inférieur
à 100 FFR.
– SELECT count(numembarcation)
– FROM embarcation, typembarcation
– WHERE embarcation.codetype = typembarcation.codetype
– AND disponible = « Oui » AND prixheure < 100 ;

– Il y a 18 embarcations qui répondent à ces critères.

2. Le nombre de locations réalisées par journée.
– SELECT date, count(numlocation)
– FROM location
– GROUP BY date ;

– Table résultat correspondant à cette requête :
– d–
ate loc
– 2–
9/08/00
– 3–
0/08/00
– 3–
1/08/00
– 0–
1/09/00

3. Le nombre d’embarcations de type « jet-ski » à une place.
– SELECT count(numembarcation)
– FROM embarcation, typembarcation
– WHERE embarcation.codetype = typembarcation.codetype
– AND nomtype = « jet-ski » AND nbplace = 1 ;
– Il y a 3 embarcations qui répondent à ces critères.

CERTA DIJON
15
4. La quantité d’embarcations disponibles de 2 places maximum, par type
d’embarcation. La requête doit afficher le nom du type d’embarcation, le
prix de la location à la demi-heure et le nombre d’embarcations
disponibles.
– SELECT nomtype, prixdemi-heure, count(numembarcation)
– FROM embarcation, typembarcation
– WHERE embarcation.codetype = typembarcation.codetype
– AND disponible = « Oui » AND nbplace <= 2 
– GROUP BY nomtype, prixdemi-heure ;

– Table résultat correspondant à cette requête :
– nom – prixde – n
type mi-heure b emb
– barq – 15 – 2
ue
– jet- – 80 – 2
ski
– jet- – 120 – 1
ski
– péda – 30 – 7
lo simple

5. Le nombre d’embarcations par type(nom) avec pour chaque type, le nombre
de places. Le résultat sera présenté par ordre croissant du nombre
d’embarcations.
– SELECT nomtype, nbplace, count(numembarcation)
– FROM embarcation, typembarcation
– WHERE embarcation.codetype = typembarcation.codetype
– GROUP BY nomtype, nbplace
– ORDER BY count(numembarcation) ;

– Table résultat correspondant à cette requête :
– nomty – n– n
pe bplace b emb
– jet-ski – 2– 2
– barque – 4– 2
– jet-ski – 1– 3
– bateau – 4– 3
à moteur
– barque – 2– 3
– pédalo – 6– 7
toboggan
– pédalo – 4– 8
double
CERTA DIJON
16
– pédalo – 2– 1
simple 0

CERTA DIJON

Vous aimerez peut-être aussi