Vous êtes sur la page 1sur 11

Université A.

Mehri, Constantine2 Faculté NTIC Année universitaire : 2018/2019


Module : Introduction aux bases de données Niveau : 2ème Année LMD

Février 2019
TD N°1
Interrogation d'une base de données relationnelle
Convention d'écriture : Dans tout schéma de base de données, une clé primaire est soulignée et une
clé étrangère est augmentée de "*".

Partie 1 : Algèbre relationnelle


On considère le schéma logique de base de données relationnelle (intension) suivant :
Cours (idCours*, Jour, Heure)
Salle (idCours, idSalle)
Notes (idCours*, idEtud*, Note)
Etudiants (idEtud, NomEtud)

Et un exemple d'extension (population) de la base de données :


Cours Salle Notes Etudiants
idCours Jour Heure idCours idSalle idCours idEtud Note idEtud NomEtud
BD Lundi 9h BD S1 BD 100 16 100 BenAli
SE Mardi 8h SE S2 SE 100 14 200 BenAhmed
SE Jeudi 10h SD S1 SD 100 15 300 BenMohamed
BD Mardi 9h BD 200 12
SD Lundi 8h BD 300 13
BD Jeudi 10h SE 300 09
SE Lundi 8h SD 200 17

A/ Donner le résultat des requêtes suivantes exprimées en algèbre relationnelle, en précisant la


nature et la sémantique de chaque opération.

1. R1 = Salle [idCours] 6. R6 = R4 ∩ R5
2. R2 = Salle [idSalle=S2] 7. R7= Cours x Salle
3. R3 = Salle – R2 8. R8 = Cours [Cours.idCours=Salle.idCours] Salle
4. R4= Cours [Jour="Mardi" AND Heure>8] 9. R9 = Notes [idCours, IdEtud]
5. R5= Cours [Heure>8] 10. R10= R9 ÷ R1

C/ Exprimer les requêtes ci-dessous dans le langage algébrique.


1. Donner la liste des cours (idCours, heure) assurés chaque Lundi.
2. Quels sont les étudiants (idEtud, NomEtud) admis dans le module Bases de Données.
3. Quelle est la salle où se trouve l'étudiant "BenAli" Mardi à 9h.
4. Quels sont les étudiants (idEtud) qui ont eu la même note en BD et SE (par exemple
l'étudiant de code 100 a eu 12 en BD et 12 en SE, L'étudiant de code 200 a eu 15 en BD et 15
en SE)
5. Quels sont les cours suivis par l'étudiant de code 100 et non pas par l'étudiant de code 300.
6. Donner la liste des étudiants (idEtud et nom) inscrits à tous les cours.
7. Quels sont les étudiants (id et nom) qui suivent au moins les mêmes cours suivis par
l'étudiant de nom "Benali".

Page 1
Université A. Mehri, Constantine2 Faculté NTIC Année universitaire : 2018/2019
Module : Introduction aux bases de données Niveau : 2ème Année LMD

Partie 2 : Langage SQL


Soit le schéma relationnel suivant :
Film (num_film, num_realisateur*, titre, genre, année) // année : Année de réalisation du film
Cinema (num_cinema, nom, adresse)
Individu (num_individu, nom, prénom)
Jouer (num_acteur, num_film*, role)
Projection (num_cinema*, num_film*, jour)

Exprimer en SQL les requêtes suivantes :


A/ On veut afficher :
1. Les titres de films réalisés en 2017.
2. Les films (num_film) projetés au cinéma El-Manar en 2018.
3. Les acteurs (nom et prénom) du film "La planète des singes".
4. Les acteurs (nom et prénom) qui sont également réalisateurs de films.

B/ On veut afficher :
5. Les acteurs (nom et prénom) qui n’ont pas joué dans des films dramatiques?
6. Le nom des réalisateurs qui n'ont produit des films qu'en 2016.
7. Le nombre de films dramatiques qui ont été projetés au cinéma El-Manar en 2018.
8. Le titre du dernier film projeté au cinéma El-Manar.

C/ On veut afficher :
9. Les noms des cinémas qui ont projeté tous les films.
10. Pour chaque cinéma (num et nom), le nombre de films projetés en 2018.
11. Les réalisateurs (nom et prénom) qui ont réalisé entre 6 et 10 films.

Questions supplémentaires :

Exprimer en SQL les requêtes suivantes :


1. Les acteurs (nom et prénom) qui ont joué dans un seul film d'actions.
2. Les cinémas (nom) qui ont projeté au moins tous les films projetés au cinéma "El-Manar".
3. Le premier film (titre, année) réalisé par Peter Jackson.

Corrigé type
Partie 01 : Algèbre relationnelle

Page 2
Université A. Mehri, Constantine2 Faculté NTIC Année universitaire : 2018/2019
Module : Introduction aux bases de données Niveau : 2ème Année LMD

B/
1. R1 = Salle [idCours]
Nature : Projection
Sémantique : La liste des cours
R1
idCours
BD
SE
SD

2. R2 = Salle [idSalle=S1]
Nature : Selection
Sémantique : Les cours qui se déroulent en salle 1
R2
idCours idSalle
BD S1
SD S1

3. R3 = Salle – R2
Nature : Différence
Sémantique : Les cours qui ne se déroulent pas en salle 1
R3
idCours idEtud Note
BD 100 16
SE 100 14
SD 100 15
BD 200 12
BD 300 13
SD 200 17

4. R4= Cours [Jour="Lundi" AND Heure>8]


Nature : Selection
Sémantique : Les cours qui se déroulent Lundi à partir de 8h
R4

idCours Jour Heure


BD Lundi 9h

5. R5= Cours [Jour = "Mardi" AND Heure>8]


Nature : Sélection
Sémantique : Les cours qui se déroulent Mardi à partir de 8h

idCours Jour Heure


BD Mardi 9h

6. R6 = R4 U R5
Nature : Sélection
Sémantique : Les cours qui se déroulent Lundi et Mardi à partir de 8h

7. R7= Cours x Salle


Nature : Produit cartésien
Sémantique : /
R7

Page 3
Université A. Mehri, Constantine2 Faculté NTIC Année universitaire : 2018/2019
Module : Introduction aux bases de données Niveau : 2ème Année LMD

idCours Jour Heure idCours idSalle


BD Lundi 9h BD S1
SE Mardi 8h BD S1
SE Jeudi 10h BD S1
BD Mardi 9h BD S1
SD Lundi 8h BD S1
BD Lundi 9h SE S2
SE Mardi 8h SE S2
SE Jeudi 10h SE S2
BD Mardi 9h SE S2
…… ……. ……. ...... …

8. R8 = Cours [Cours.idCours=Salle.idCours] Salle


Nature : Jointure naturelle
Sémantique : Les cours avec horaire et Salle
R8

idCours Jour Heure idSalle


BD Lundi 9h S1
BD Mardi 9h S1
SE Mardi 8h S2
SE Jeudi 10h S2
SD Lundi 8h S1
BD Jeudi 10h S1
SE Lundi 8h S2

9. R9 = Notes [idCours, IdEtud]


Nature : Projection
Sémantique : Etudiants (Identifiant) avec les cours (identifiant) qu’ils suivent

R9
idCours idEtud
BD 100
SE 100
SD 100
BD 200
BD 300
SD 200

10. R12= R9÷ R1


Nature : Division
Sémantique : Les étudiants qui suivent tous les cours
idEtud
100

B/
1. Donner la liste des cours (idCours, heure) assurés chaque Lundi.
R1 = cours[jour = ‘Lundi’]
Res = R1[idCours, heure]

2. Quels sont les étudiants (idEtud, NomEtud) admis dans le module Bases de Données.
R1 = Notes[note >=10 AND idCours=’BD’]
Res = R1[idEtud].

Page 4
Université A. Mehri, Constantine2 Faculté NTIC Année universitaire : 2018/2019
Module : Introduction aux bases de données Niveau : 2ème Année LMD

Remarque supp: Donner par nom, la liste des étudiants admis en BD


R2= Res[Res. idEtud = Etudiant.idEtud]Etudiants
Res’ = R2[nomEtud].

3. Quelle est la salle où se trouve l'étudiant "BenAli" Mardi à 9h.


R1 = Etudiant[idNom = ‘Benali’]
R2 = R1 [R1.idEtud=Notes.idEtud] Notes
R3 = Cours [jour=’Mardi’ AND heure = ‘9h’]
R4 = R2 [R2.idCours=R3.idCours] R3
R5 = R4 [R4.idCours=Salle.idCours]salle
Res = R5[idSalle]

4. Quels sont les étudiants (idEtud) qui ont eu la même note en BD et SE (par exemple l'étudiant de code
100 a eu 12 en BD et 12 en SE, L'étudiant de code 200 a eu 15 en BD et 15 en SE)
R1 = Notes [idcours=”BD”]
R2 = Notes [idcours =”SE”]
R3 = R1[R1.idEtud=R2.idEtud AND R1.note = R2.note] R1
Res = R3[idEtud]

5. Quels sont les cours suivis par l'étudiant de code 100 et non pas par l'étudiant de code 300.
R1 = notes[idEtud=100]
R2 = R1[idCours]
R3 = notes[idEtud=300]
R4 = R1[idCours]
Res = R2 – R4

6. Donner la liste des étudiants (idEtud et nom) inscrits à tous les cours.
R1 = Notes[Notes.idEtud=Etudiants.idEtud]
R2 = R1[idEtud, nomEtud, idCours]
R3 = Cours[idCours]
Res = R2 ÷ R3

7. Quels sont les étudiants (id et nom) qui suivent au moins les mêmes cours suivis par l'étudiant de nom
"Benali".
R1= Etudiants[nomEtud = "Benali"]
R2 = R1[idEtud]
R3 = R1 [R1.idEtud = Notes.idEtud] Notes
R4 = R3[idcours]
R5 = Notes[idEtud, idCours]
R6 = R5 ÷ R4
R6 = R5 [R5.idEtud = Etudiants.idEtud] Etudiants
Res = R6 [idEtud, nomEtud]

Partie 02 : Langage SQL


Exprimer en SQL les requêtes suivantes :
A/ On veut afficher :
1. Les titres de films réalisés en 2017.
SELECT titre
FROM film
WHERE année = 2017

2. Les films (num_film, titre, genre) projetés au cinéma El-Manar en 2017.


SELECT DISTINCT num_film

Page 5
Université A. Mehri, Constantine2 Faculté NTIC Année universitaire : 2018/2019
Module : Introduction aux bases de données Niveau : 2ème Année LMD

FROM film F, projection P, Cinéma C


WHERE F.num_film = P.num_film
AND P.num_cinema = C.num_cinema
AND C.nom= “El-Manar"
AND jour LIKE “%2017”

OU BIEN
SELECT num_film
FROM film F
WHERE num_film IN ( SELECT num_film
FROM projection
WHERE jour LIKE “%2017”
AND num_cinema IN ( SELECT num_cinema
FROM Cinéma
WHERE nom = “El-Manar")
)
3. Les acteurs (nom et prénom) du film "La planète des singes".
SELECT nom , prénom
FROM Individu I, Jouer J, film F
WHERE I. num_individu = J.num_acteur AND J_num-film = F.num_film
AND titre = "La planète des singes"
OU BIEN
SELECT nom , prénom
FROM Individu
WHERE num_individu IN ( SELECT num_acteur
FROM jouer
WHERE num_film IN (SELECT num_film
FROM film
WHERE titre = "La planète des singes"))

4. Les acteurs (nom et prénom) qui sont également réalisateurs de films.


SELECT nom , prénom
FROM Individu
WHERE num_individu IN ( SELECT num_acteur FROM jouer)
AND num_individu IN (SELECT num_realisateur FROM film)

OU BIEN
SELECT nom , prénom
FROM Individu
WHERE num_individu IN ( SELECT num_acteur
FROM jouer J, film F
WHERE J.num_acteur = F.num_realisateur)

B/
5. Les acteurs (nom et prénom) qui n’ont pas joué dans des films dramatiques?

Page 6
Université A. Mehri, Constantine2 Faculté NTIC Année universitaire : 2018/2019
Module : Introduction aux bases de données Niveau : 2ème Année LMD

SELECT nom, premon


FROM individu WHERE num-individu NOT IN (SELECT num_acteur FROM jouer J, Film F
WHERE J.num_film = F.num_film
AND genre = “dramatique”)

OU BIEN
SELECT nom, premon
FROM individu I
WHERE NOT EXISTS (SELECT num-acteur FROM jouer J, Film F
WHERE J.num-film = F.num_film
AND genre = “dramatique”
AND J.num_acteur = I.num_individu)

6. Le nom des réalisateurs qui n'ont produit des films qu'en 2016.

SELECt nom
FROM Individu I
WHERE 2016 >ALL (SELECT année FROM Film WHERE num_realisateur = I.num_individu)

OU BIEN :

SELECT nom
FROM individu I
WHERE NOT EXISTS (SELECT num_film
FROM film F
WHERE année != 2016
AND I.num_individu = F.num_realisateur)

7. Le nombre de films dramatiques qui ont été projetés au cinéma El-Manar en 2018.
SELECT COUNT (num_film)
FROM film
WHERE genre = “dramatique”
AND num_film IN (SELECT num_film FROM projection
WHERE num_cinema IN (SELECT num_cinema FROM cinema
WHERE nom = “EL-Manar”)
AND jour LIKE “%2018”)
OU BIEN
SELECT COUNT ( DISTINCT num_film) /* Si le DISTINCT n'est pas précisé, on aura le nombre de projections de
films dramatiques*/
FROM film F, projection P, cinema C
WHERE F.num_film = P.num_film
AND P.num_cinema = C.num_cinema
AND genre = “dramatique”
AND C.nom = “EL-Manar”
AND jour LIKE “%2018”

8. Le titre du dernier film projeté au cinéma El-Manar.

Page 7
Université A. Mehri, Constantine2 Faculté NTIC Année universitaire : 2018/2019
Module : Introduction aux bases de données Niveau : 2ème Année LMD

/*Voici quelques possibilités d'expressions différentes des jointures*/


SELECT titre
FROM film
WHERE num_film IN (SELECT num_film
FROM projection
WHERE num_cinema IN (SELECT num_cinema FROM cinema
WHERE nom="El-Manar")
AND jour = (SELECT MAX (jour)
FROM projection P1, cinema C1
WHERE P.num_cinema= C.num_cinema
AND nom="El-Manar")
)
OU BIEN :
SELECT titre
FROM film
WHERE num_film IN (SELECT num_film
FROM projection P, cinema C
WHERE P.num_cinema = C.num_cinema
AND nom="El-Manar"
AND jour = (SELECT MAX (jour)
FROM projection P1, cinema C1
WHERE P.num_cinema= C.num_cinema
AND nom="El-Manar")
)

OU BIEN

SELECT titre
FROM film F, projection P, cinema C
WHERE F.num_film = P.num_film
AND P.num_cinema = C.num_cinema
AND nom="El-Manar"
AND jour = (SELECT MAX (jour)
FROM projection P1, cinema C1
WHERE P.num_cinema= C.num_cinema
AND nom="El-Manar")

C/
9. Les noms des cinémas qui ont projeté tous les films ?
ère
1 solution : Non supportée par MySql (voir Cours : Opération de Division)
SELECT nom
FROM cinema C
WHERE num_cinema IN ( SELECT num_cinema
FROM projection
GROUP BY num_cinema
HAVING SET(num_film) CONTAINS (SELECT num_film FROM film))
OU BIEN :
/*Toutes les jointures en dessus et en dessous peuvent être exprimées par des restrictions sur le
produit cartésien*/
SELECT nom

Page 8
Université A. Mehri, Constantine2 Faculté NTIC Année universitaire : 2018/2019
Module : Introduction aux bases de données Niveau : 2ème Année LMD

FROM cinema C, projection P


WHERE C.num_cinema = P.num_cinema
GROUP BY num_cinema
HAVING SET(num_film) CONTAINS (SELECT num_film FROM film)

2ème solution : Supportée par MySql


SELECT nom
FROM cinema C
WHERE NOT EXISTS (SELECT num_film
FROM film
WHERE num_film NOT IN (SELECT num_film FROM projection
WHERE num_cinema = C. num_cinema)
)
3ème solution : Supportée par MySql
SELECT nom
FROM cinema C, projection P
WHERE C.num_cinema = P.num_cinema
GROUP BY num_cinema
HAVING COUNT(num_film) = (SELECT COUNT(num_film) FROM film)

10. Pour chaque cinéma (num et nom), le nombre de films projetés en 2018.
/* Si le DISTINCT n'est pas précisé, on aura pour chaque cinéma le nombre de projections de 2018 et non pas le nombre
de films projetés */
SELECT num_cinema, COUNT (DISTINCT num_film)
FROM projection
WHERE jour LIKE “%2018”
GROUP BY num_cinema

11. Les réalisateurs (nom et prénom) qui ont réalisé entre 6 et 10 films.
SELECT nom, prenom
FROM individu
WHERE num-individu IN (SELECT num_réalisateur
FROM film
GROUP BY num_realisateur
HAVING COUNT(*) <=10 AND COUNT(*) >=6)

Questions supplémentaires :
1. Les acteurs (nom et prénom) qui ont joué dans un seul film d'actions.
SELECT nom, premon
FROM individu WHERE num-individu IN (SELECT num-acteur FROM jouer J, film F
WHERE J.num_film = F.num_film

Page 9
Université A. Mehri, Constantine2 Faculté NTIC Année universitaire : 2018/2019
Module : Introduction aux bases de données Niveau : 2ème Année LMD

AND genre = “action”


GROUP BY num_acteur
HAVING COUNT(num_film) =1)

2. Les cinémas (nom) qui ont projeté au moins tous les films projetés au cinéma "El-Manar".
ère
1 solution : Non supportée par MySql (voir Cours : Opération de Division)
SELECT nom
From cinéma
WHERE num_cinema IN (SELECT num-cinema
FROM projection
GROUP BY num_cinema
HAVING SET(num_film) CONTAINS (SELECT num-film
FROM projection
WHERE num_cinema IN (SELECT
num_cinema
FROM cinema
WHERE nom =
“El-manar”))
)
ème
2 solution : Supportée par MySql
SELECT nom
From cinéma C
WHERE NOT EXISTS (SELECT num_film
FROM film
WHERE num_film IN (SELECT num_film
FROM projection P
WHERE num_cinema IN (SELECT num-cinema
FROM cinema
WHERE nom = “El-manar”))
AND num_film NOT IN (SELECT num_film
FROM projection P
WHERE C.num_cinema = P.num_cinema)
)

3. Le premier film (titre, année) réalisé par Peter Jackson.


SELECT titre, année
FROM film
WHERE num_réalisateur IN (SELECT num_individu FROM individu
WHERE nom = “Peter Jackson")
AND année <= ALL (SELECT année
FROM film
WHERE num_realisateur IN (SELECT num_individu FROM individu
WHERE nom = “Peter Jackson »))
OU BIEN
SELECT titre, année

Page 10
Université A. Mehri, Constantine2 Faculté NTIC Année universitaire : 2018/2019
Module : Introduction aux bases de données Niveau : 2ème Année LMD

FROM film
WHERE num_réalisateur IN (SELECT num_individu FROM individu
WHERE nom = “Peter Jackson")
AND année = (SELECT MIN (année)
FROM film
WHERE num_realisateur IN (SELECT num_individu FROM individu
WHERE nom = “Peter Jackson »))

Page 11

Vous aimerez peut-être aussi