Vous êtes sur la page 1sur 6

BDW1 - TD 1

Des requêtes SQL


UCBL - Département Informatique de Lyon 1 – 2018

Corrections

L’objectif de ce TD est de vous familiariser avec les premiers éléments de la syntaxe SQL.

Exercice 1 : Base MAGASINS


Soit le schéma de la relation magasins suivant :
Magasin(idM, Nom, Categorie, Ville, Gerant)

idM Nom Categorie Ville Gerant


1 TASCORAMA Bricolage Bron Yvan Declou
2 TASCORAMA Bricolage Rillieux-la-Pape Eddy Visse
3 LECIO Textile Lyon Ella Laclasse
4 SAPEY Textile Lyon Côme Jamet
5 LOUBANGER Informatique Lyon Yann Apadebeugue
6 VBH Bricolage Paris Elvis Tourne

a) Exprimer en langage naturel ce que retournent les requêtes suivantes :

1. SELECT Nom FROM Magasin ;

2. SELECT DISTINCT C a t e g o r i e
FROM Magasin WHERE V i l l e = ’ Lyon ’ ;

3. SELECT ∗
FROM Magasin
WHERE V i l l e != ’ Lyon ’ AND C a t e g o r i e = ’ B r i c o l a g e ’
ORDER BY Nom;

4. SELECT DISTINCT M1. idM , M2. idM


FROM Magasin M1 JOIN Magasin M2
ON M1. V i l l e = M2. V i l l e AND M1. idM != M2. idM ;

b) Quelle modification apporteriez-vous à la dernière requête pour éviter d’avoir les pairs
symétriques dans le résultat (par exemple : (3,4) et (4,3)) ?

1
Exercice 2 : Base JOUEURS
Soient les schémas de la relation JOUEUR et PALMARES suivant :
JOUEUR(Nom, Prenom, AnNaiss, Nation, Taille, Poids)
PALMARES(#Nom, Annee, Titre)

Donner les requêtes SQL permettant de répondre aux besoins suivants :

1. Donner le nom et le prénom des joueurs.


2. Donner les joueurs nés avant 1987 (inclus) ou ceux faisant plus de 78kg (strict).
3. Donner le nom et le prénom des joueurs ayant eu un palmarès en 2014.
4. Donner le nom et le palmarès (Titre et année) des joueurs nés la même année que le
joueur Emile Maitre.
5. Donner le nom des joueurs titrés en 2010 et 2014.

Exercice 3 : Base UNIVERSITE


Soit le schéma de la base de données UNIVERSITE suivant :
Etudiant (NumEt, NomEt, PrenomEt, Age, Ville, Statut)
UE (NumUE, NomUE , nbECTS)
Inscription (#NumEt, #NumUE, Semestre, Annee, NoteFinale)

La relation Etudiant donne pour chaque étudiant son numéro d’étudiant, son nom, son pré-
nom et son âge, la ville où il habite et son statut (célibataire, marié(e) . . .)
La relation UE donne pour chaque UE son numéro, son nom et le nombre d’ECTS associés.
La relation Inscription fait le lien entre les étudiants, les UE qu’ils suivent durant un semestre
(S1 pour le semestre automne ou S2 pour le semestre printemps) d’une année pendant lesquelles
ils ont suivi cette UE et la note finale (correspondant à la moyenne) qu’ils ont obtenue.

Donner les requêtes SQL permettant de répondre aux besoins suivants :

1. Donner le nom des UE dont on ne connaît pas le nombre d’ECTS associés.


2. Donner le numéro des UE dont le nom commence par ’BDW’ ou contenant les caractères
’info’.
3. Donner le numéro des étudiants dont le nom a pour troisième caractère un ’M’.
4. Donner le nom de toutes les UE suivies par l’étudiant "Jean Vidaprendre". On précisera
pour chaque UE, le nombre d’ECTS associés, ainsi que le semestre et l’année d’ins-
cription. Le résultat sera trié par année décroissante, puis par semestre, puis par ordre
lexicographique sur les noms d’UE.
5. Donner le nom des UE de 6 ECTS ouvertes (i.e. avec des inscrits) aux deux semestres
de l’année universitaire 2017-2018.
6. Donner le nom et le prénom des étudiants ayant validé (i.e. note finale supérieure à 10)
l’UE BDW1 au premier semestre de l’année universitaire 2014-2015. Le résultat sera trié
par ordre lexicographique de nom puis de prénom.

BDW1 - Nicolas Lumineau 2 Partie SQL


Exercice 4 : Base TRAIN
On considère le schéma de base de données suivant :

Ligne (NoLigne, VilleDep, VilleArr)


Arret (#NoLigne, Rang, Ville)
Trafic (NoTrain, #NoLigne, NoJour)
Train (#NoTrain, #NoWagon)
Wagon (NoWagon, TypeWagon, PoidsVide, Capacite, Etat)

La relation Ligne donne pour chaque ligne de train la gare de départ et la gare d’arrivée.
La relation Arret donne le rang et la ville de l’arrêt pour une ligne donnée. La relation Tra-
fic associe les trains et les lignes parcourues par ces trains à un numéro de jour de semaine
donné (1 pour lundi, 2 pour mardi...). La relation Train liste les wagons qui composent un
train. La relation Wagon donne les caractéristiques de chaque wagon (l’état peut être "libre"
ou "occupé"). Le poids est exprimé en kg.

Exemple d’instance de base :

Pour Ligne : {(1,’Lyon’,’Clermont-Ferrand’), (2,’Lyon’, ’Marseille’), ... }


Pour Arret : {(1,1,’Gannat’), (2,1,’Valence’), (2,2, ’Avignon’), ... }
Pour Trafic : {(1,1,1),(1,1,2),(1,1,3),(1,1,4), (1,1,5),(2,2,6),(2,2,7), ... }
Pour Train : {(1,1), (1,3), (1,4), (1,5), (2,9), (2,10), ... }
Pour Wagon : {(1,’Passagers’, NULL, 150, ’Libre’ ),
(2,’Marchandise’, 12345, NULL, ’Occupé’ ), ... }

Donner les requêtes SQL permettant de répondre aux questions suivantes :

1. Donner la liste des gares traversées par la ligne 3. Le résultat sera renommé ’GareTra-
verseeParL3’ et sera trié selon le rang de l’arrêt.
2. Donner les numéros des wagons faisant à vide entre 800kg et 2tonnes et de type ’Mar-
chandise’.
3. Donner les wagons dont on ne connaît pas soit le poids à vide soit la capacité.
4. Donner les numéros des lignes partant de Lyon et pour lesquelles au moins un train
circule le mercredi.
5. Donner les wagons de type ’Marchandise’ de capacité inférieure strictement à celle du
wagon 12.
6. Donner les couples de numéros de wagons qui sont libres, de même type, de même poids
à vide mais de capacités différentes.
7. Donner le numéro des trains qui sont composés d’au moins deux wagons de type ’Pas-
sagers’ et qui partent de ’Dijon’ ou arrivent à ’Valence’.

BDW1 - Nicolas Lumineau 3 Partie SQL


Corrections du TD

Réponse de l’exercice 1
a)
1. La requête donne le nom des magasins. Il s’agit d’une projection sur l’attribut Nom.
2. La requête donne les catégories de magasins présentes à Lyon. Il s’agit d’une sélection
des tuples dont la valeur de l’attribut Ville vaut Lyon, puis une projection sur l’attribut
Categorie sur laquelle les doublons sont supprimés grâce au DISTINCT.
3. La requête donne les magasins de bricolage se trouvant hors de Lyon. Le résultat sera
affiché selon l’ordre lexicographique sur le nom du magasin.
4. La requête donne les pairs d’identifiants de magasins se trouvant dans la même ville.
Il s’agit ici d’une auto-jointure de Magasin sur l’attribut Ville. Pour éviter d’avoir les
pairs contenant les deux mêmes identifiants, on rajoute la contrainte que les identifiants
soient différents.
b) On remplace le != entre les identifiants de magasin par un < (ou >).
SELECT DISTINCT M1. idM , M2. idM
FROM Magasin M1 JOIN Magasin M2
ON M1. V i l l e = M2. V i l l e AND M1. idM < M2. idM ;
Dans le cas du < , on aura uniquement (3,4) et pas (4,3).

Réponse de l’exercice 2
1. SELECT nom , prenom
FROM Joueur

2. SELECT ∗
FROM Joueur j
WHERE j . AnNaiss <=1987 OR j . Poids >78;

3. SELECT j . Nom, j . Prenom


FROM Joueur j , Palmares p
WHERE p . Annee=2014
AND j .Nom = p .Nom;
ou
SELECT j . Nom, j . Prenom
FROM Joueur j JOIN Palmares p ON j .Nom = p .Nom
WHERE p . Annee =2014;
ou
SELECT j . Nom, j . Prenom
FROM Joueur j NATURAL JOIN Palmares p
WHERE p . Annee =2014;

4. SELECT j . nom , p . T i t r e , p . Annee


FROM Joueur j JOIN Palmares p ON j .Nom = p .Nom
JOIN Joueur em ON em . AnNaiss=j . AnNaiss
WHERE em .Nom= ’ Maitre ’
AND em . Prenom= ’ Emile ’ ;

BDW1 - Nicolas Lumineau 4 Partie SQL


5. SELECT p1 . nom
FROM Palmares p1 JOIN Palmares p2 ON p1 .Nom=p2 .Nom
WHERE p1 . Annee=2010
AND p2 . Annee =2014;

Réponse de l’exercice 3
1. SELECT nomUE
FROM UE
WHERE nbEcts IS NULL;

2. SELECT nomUE
FROM UE
WHERE nomUE LIKE ’BDW%’ OR nomUE LIKE ’%i n f o%’ ;

3. ELECT NomEt
FROM Etudiant
WHERE NomEt LIKE ’__M%’ ;

4. SELECT UE.NomUE, UE. nbEcts , i . Annee , i . s e m e s t r e


FROM UE JOIN I n s c r i p t i o n i ON i .NumUE = UE.NumUE
JOIN Etudiant e ON i . NumEt = e . NumEt
WHERE e .Nom = ’ Vidaprendre ’
AND e . Prenom= ’ Jean ’
ORDER BY i . Annee DESC, i . s e m e s t r e , UE.NomUE

5. SELECT UE. nom


FROM UE JOIN I n s c r i p t i o n i 1 ON i 1 .numUE=UE.NumUE
JOIN I n s c r i p t i o n i 2 ON i 2 .numUE=UE.NumUE
WHERE UE. nbEcts=6
AND i 1 . Annee=2014 AND i 1 . s e m e s t r e= ’ S1 ’
AND i 2 . Annee=2015 AND i 2 . s e m e s t r e= ’ S2 ’ ;

6. SELECT e . nom , e . prenom


FROM UE JOIN I n s c r i p t i o n i ON UE.numUE = i .numUE
JOIN Etudiant e ON e . numEt = i . numEt
WHERE i . annee =2014
AND UE. nomUE = ’BDW1’
AND i . s e m e s t r e= ’ S2 ’
AND i . n o t e F i n a l e >= 10
ORDER BY e . nom , e . prenom ;

Réponse de l’exercice 4
1. SELECT V i l l e AS GareTraverseeParL3
FROM A r r e t WHERE NoLigne=3
ORDER BY rang ;

BDW1 - Nicolas Lumineau 5 Partie SQL


2. SELECT NoWagon
FROM Wagon
WHERE PoidsVide BETWEEN 800 AND 2000
AND typeW = ’ Marchandise ’ ;

3. SELECT No_wagon
FROM Wagon
WHERE PoidsVide IS NULL OR C a p a c i t e IS NULL;

4. SELECT L . NoLigne
FROM T r a f i c T JOIN Ligne L ON T. NoLigne = L . NoLigne
WHERE T. NoJour=3 AND L . V i l l e D e p = ’ Lyon ’ ;

5. SELECT W1. ∗
FROM Wagon W1 JOIN Wagon W2 ON W1. C a p a c i t e < W2. C a p a c i t e
WHERE W1. typeWagon = ’ Marchandise ’ AND W2. NoWagon = 1 2 ;

6. SELECT W1. NoWagon , W2. NoWagon


FROM Wagon W1 JOIN Wagon W2 ON W1. TypeWagon = W2. typeWagon
AND W1. PoidsVide = W1. PoidsVide
AND W1. C a p a c i t e < W2. C a p a c i t e
WHERE W1. e t a t = ’ L i b r e ’ AND W2. e t a t = ’ L i b r e ’ ;

7. SELECT T. NoTrain
FROM Train T JOIN Wagon W1 ON T. NoWagon = W1. NoWagon
JOIN Wagon W2 ON T. NoWagon = W2. NoWagon
AND W1. NoWagon != W2. NoWagon)
JOIN T r a f i c Tr ON Tr . NoTrain = T. NoTrain
JOIN Ligne L ON Tr . NoLigne = L . NoLigne
WHERE W1. typeWagon = ’ P a s s a g e r s ’
AND W2. typeWagon = ’ P a s s a g e r s ’
AND (L . V i l l e D e p = ’ Dijon ’ OR L . V i l l e A r r = ’ Valence ’ ) ;

BDW1 - Nicolas Lumineau 6 Partie SQL