Académique Documents
Professionnel Documents
Culture Documents
SQL 5
SQL 5
SQL
stph.scenari-community.org/bdd
sql5.pdf
Stéphane Crozat
II - Exercice 8
III - Devoir 13
Cours
I
1. Imbrication de requêtes en SQL
Objectifs
Être capable d'apprendre des notions particulières de SQL liés à un SGBD en particulier ou à des évolutions
futures de SQL.
Introduction
Il est possible d'imbriquer des requêtes les unes dans les autres pour procéduraliser les questions, et ainsi
répondre à des questions plus complexes, voire impossibles, à écrire en algèbre relationnel classique.
Définition : Sous-requête
Requête incluse dans la clause WHERE ou FROM d'une autre requête.
1 SELECT <projections>
2 FROM <relations>
3 WHERE <sous-requête>
Exemple
1 SELECT Nom
2 FROM Chercheur
3 WHERE Nom IN
4 (SELECT Nom FROM Enseignant)
Introduction
Cette sous-requête permet de vérifier que la projection d'un tuple de la requête principale est présent dans la
sous-requête.
3
Sous-requête d'existence EXISTS
Syntaxe
1 SELECT <projections>
2 FROM <relations>
3 WHERE (<projection d un tuple>) IN
4 (<requête imbriquée>)
La projection du tuple de la requête principale doit conduire à un schéma relationnel identique à celui de la
requête imbriquée.
1 SELECT Chercheur.Nom
2 FROM Chercheur
3 WHERE Chercheur.Universite IN
4 (SELECT Universite.Nom
5 FROM Universite
6 WHERE Universite.Ville='Paris')
1 SELECT N°SS
2 FROM Chercheur
3 WHERE (Nom, Prenom, Age) IN
4 (SELECT Nom, Prenom, Age
5 FROM Enseignant)
1 SELECT Nom
2 FROM Chercheur
3 WHERE Universite='Paris6' AND Nom IN
4 (SELECT Nom
5 FROM Enseignant
6 WHERE Universite IN
7 (SELECT Nom
8 FROM Universite
9 WHERE Ville='Paris'))
Remarque : NOT IN
On peut tester la non existence du tuple dans la sous requête en utilisant la clause NOT IN à la place de la clause
IN.
Introduction
4
Sous-requête de comparaison ALL
Syntaxe
1 SELECT <projections>
2 FROM <relations>
3 WHERE EXISTS
4 (<requête imbriquée>)
La requête imbriquée faisant référence à des propriétés (éventuellement non projetées) de la requête principale.
Exemple
1 SELECT Chercheur.Nom
2 FROM Chercheur
3 WHERE EXISTS
4 (SELECT *
5 FROM Universite
6 WHERE Universite.Nom=Chercheur.Universite)
Introduction
Cette sous-requête permet de vérifier que les tuples de la requête principale vérifient bien une condition donnée
avec tous les tuples de la sous-requête.
Syntaxe
1 SELECT <projections>
2 FROM <relations>
3 WHERE <propriété> <opérateur de comparaison> ALL
4 (<requête imbriquée>)
La requête imbriquée renvoyant un tuple ne comportant qu'une propriété de même domaine que la propriété
testée de la requête principale.
Exemple
1 SELECT Nom
2 FROM Chercheur
3 WHERE Age > ALL
4 (SELECT Age
5 FROM Etudiant)
5
Sous-requête de comparaison ANY
Introduction
Cette sous-requête permet de vérifier que les tuples de la requête principale vérifie bien une condition donnée
avec au moins un tuple de la sous-requête.
Syntaxe
1 SELECT <projections>
2 FROM <relations>
3 WHERE <propriété> <opérateur de comparaison> ANY
4 (<requête imbriquée>)
La requête imbriquée renvoyant un tuple ne comportant qu'une propriété de même domaine que la propriété
testée de la requête principale.
Exemple
1 SELECT Nom
2 FROM Chercheur
3 WHERE Age < ANY
4 (SELECT Age
5 FROM Etudiant)
Remarque : SOME
SOME peut être utilisé comme un synonyme de ANY.
Syntaxe
6
Sous-requêtes dans la clause FROM
Méthode
Cette extension est particulièrement utile pour les calculs d’agrégat après filtrage ou pour enchaîner les calculs d’
agrégat (par exemple pour faire la moyenne de comptage après regroupement).
1 SELECT AVG(c)
2 FROM (SELECT COUNT(b) AS c FROM t GROUP BY a)
7
Exercice
Exercice
II
1. Exercice : Gestion de bus II
[10 min]
Une société de gestion d'autobus urbains dispose de la base de données ci-après pour représenter ses
conducteurs, ses bus et ses lignes de bus.
Écrivez en algèbre relationnelle la requête permettant de renvoyer le nombre d'exemplaires du livre intitulé
"Les cinq disciplines" qui est détenu par la bibliothèque qui a comme nom "Paris".
Écrivez en en algèbre relationnelle la requête permettant de renvoyer pour chaque livre écrit par "Douglas
Kennedy" le nombre d'exemplaires détenus par la bibliothèque "Paris"
8
Exercice : Re-re-re-représentation de représentants (épisode ultime)
Écrivez en SQL la requête qui permet de renvoyer le titre du livre, le nom de l'emprunteur, et l'adresse de
l'emprunteur pour chaque livre qui est prêté par la bibliothèque "Paris" et dont la date de retour est
aujourd'hui.
Indice :
Utiliser une fonction today() pour renvoyer la date du jour (par exemple, le 15 mai 2013, today()
='2013/05/14').
Écrivez en SQL la requête qui permet de récupérer les noms de tous les emprunteurs qui ont rendu leurs livres
empruntés.
Écrivez en SQL la requête permettant de récupérer les noms, adresses et nombre de livres empruntés pour
chaque emprunteur qui a emprunté plus que 5 livres.
1 /* Les requêtes peuvent être testées dans un SGBDR, en créant une base de
données avec le script SQL suivant */
2
3 /*
4 DROP TABLE VENTES ;
5 DROP TABLE CLIENTS ;
6 DROP TABLE PRODUITS ;
7 DROP TABLE REPRESENTANTS ;
8 */
9
10 CREATE TABLE REPRESENTANTS (
11 NR INTEGER PRIMARY KEY,
12 NOMR VARCHAR,
13 VILLE VARCHAR
14 );
15
16 CREATE TABLE PRODUITS (
17 NP INTEGER PRIMARY KEY,
18 NOMP VARCHAR,
19 COUL VARCHAR,
20 PDS INTEGER
21 );
22
23 CREATE TABLE CLIENTS (
9
Exercice : Re-re-re-représentation de représentants (épisode ultime)
10
Exercice : Re-re-re-représentation de représentants (épisode ultime)
On souhaite les numéros des clients qui n'ont rien acheté à un représentant de Paris.
Indices :
1 nc
2 ----
3 1
4 2
5 4
6 5
1 SELECT C.NC
2 FROM CLIENTS C
3 WHERE 'Paris' NOT IN
4(
5 ...
6) ;
On souhaite les noms des représentants ayant vendu quelque chose aux clients 1 et 2.
Indices :
1 nomr
2 ----------
3 Stephane
4 Leonard
1 SELECT R.NOMR
2 FROM REPRESENTANTS R
3 WHERE 1 IN (...)
4 AND 2 IN (...);
Pour chaque couple de représentants ayant vendu dans la même ville, on souhaite le nom de la ville, le nom de
ces représentants tel que celui a vendu le plus est en premier.
Proposez une solution avec vue, une solution avec sous-requête dans la clause FROM et une solution avec sous-
requête dans la clause WHERE
Indice :
11
Exercice : Re-re-re-représentation de représentants (épisode ultime)
On souhaite les noms des représentants ayant vendu quelque chose à tous les clients.
On proposera une solution avec une vue et au moins une solution avec des sous-requêtes.
Indice :
1 nomr
2 ---------
3 Leonard
12
Devoir
Devoir
III
1. Exercice : Re-re-représentation de représentants
[1 h]
Soit la base de données suivante :
1 /* Les requêtes peuvent être testées dans un SGBDR, en créant une base de
données avec le script SQL suivant */
2
3 /*
4 DROP TABLE VENTES ;
5 DROP TABLE CLIENTS ;
6 DROP TABLE PRODUITS ;
7 DROP TABLE REPRESENTANTS ;
8 */
9
10 CREATE TABLE REPRESENTANTS (
11 NR INTEGER PRIMARY KEY,
12 NOMR VARCHAR,
13 VILLE VARCHAR
14 );
15
16 CREATE TABLE PRODUITS (
17 NP INTEGER PRIMARY KEY,
18 NOMP VARCHAR,
19 COUL VARCHAR,
20 PDS INTEGER
21 );
22
23 CREATE TABLE CLIENTS (
24 NC INTEGER PRIMARY KEY,
25 NOMC VARCHAR,
26 VILLE VARCHAR
27 );
28
29 CREATE TABLE VENTES (
30 NR INTEGER REFERENCES REPRESENTANTS(NR),
31 NP INTEGER REFERENCES PRODUITS(NP),
32 NC INTEGER REFERENCES CLIENTS(NC),
33 QT INTEGER,
34 PRIMARY KEY (NR, NP, NC)
35 );
36
13
Exercice : Re-re-représentation de représentants
Question 1
On souhaite les numéros des produits vendus à un client de Lyon par un représentant de Lyon.
Indice :
1 np
2 ----
3 1
4 4
5 3
6
Question 2
On souhaite les noms des produits vendus à un client par un représentant issu de la même ville.
Indice :
1 nomp
2 ------------
3 Aspirateur
4 Chaise
5 Tapis
14
Exercice : Re-re-représentation de représentants
Question 3
On souhaite les noms des représentants qui n'ont jamais rien vendu.
Proposez deux solutions sans sous-requête (et sans vue) et deux solutions avec des sous-requêtes.
Indices :
1 nomr
2 -------
3 Bruno
Question 4
On souhaite les numéros des clients ayant acheté quelque chose à au moins un représentant issu de la même
ville.
Indice :
1 nc
2 ----
3 1
4 2
Question 5
On souhaite les numéros de tous les produits tels qu'il n'en existe aucun autre ayant un poids plus faible.
Proposez une solution avec une vue, une solution avec une sous-requête dans la clause FROM et une solution
avec une sous-requête dans la clause WHERE.
Indice :
1 np
2 ----
3 2
4 4
15
Solutions des exercices
1 SELECT N°Ligne
2 FROM
3 (SELECT N°Ligne, Max(Rang) AS Arrivée
4 FROM Arrêts
5 GROUP BY N°Ligne) R1,
6 Arrêts,
7 Station
8 WHERE R1.N°Ligne=Arrêts.N°Ligne
9 AND R1.Arrivé=Arrêts.Rang
10 AND Arrêt.N°Station= Station.N°Station
11 AND Station.Nom='Royallieu';
16
Stéphane Crozat
Solutions des exercices
1. Soit on considère que DateRetour est la date ou l'emprunteur doit rendre le livre
2. Soit on considère que l'emprunteur qui a rendu le livre est celui qui n'a pas de valeur
1 SELECT E.nom
2 FROM Emprunteur E,Livre_Emprunte LE
3 WHERE LE.NumCard=E.NumCard
4 AND LE.DateRetour < today();
1 SELECT Nom
2 FROM Emprunteur
3 WHERE NumCard NOT IN
4 (SELECT NumCard FROM Livre_Emprunte)
1 SELECT C.NC
2 FROM CLIENTS C
3 WHERE 'Paris' NOT IN
4(
5 SELECT R.VILLE
6 FROM VENTES V, REPRESENTANTS R
7 WHERE V.NR=R.NR
8 AND V.NC=C.NC
9) ;
Solution alternative
1 SELECT C.NC
2 FROM CLIENTS C
3 WHERE NOT EXISTS (
4 SELECT R.*
5 FROM VENTES V, REPRESENTANTS R
6 WHERE V.NR=R.NR
7 AND V.NC=C.NC
8 AND R.VILLE='Paris'
9) ;
17
Stéphane Crozat
Solutions des exercices
1 SELECT R.NOMR
2 FROM REPRESENTANTS R
3 WHERE 1 IN (SELECT V.NC FROM VENTES V WHERE V.NR=R.NR)
4 AND 2 IN (SELECT V.NC FROM VENTES V WHERE V.NR=R.NR);
18
Stéphane Crozat
Solutions des exercices
4 EXCEPT
5 SELECT R.NOMR, V.NC
6 FROM REPRESENTANTS R, VENTES V
7 WHERE V.NR=R.NR;
8
9 SELECT R.NOMR
10 FROM REPRESENTANTS R, VENTES V
11 WHERE R.NR=V.NR
12 EXCEPT
13 SELECT NOMR FROM vue;
Sans vue
1 SELECT R.NOMR
2 FROM REPRESENTANTS R
3 WHERE R.NR IN (
4 SELECT V.NR
5 FROM VENTES V
6 GROUP BY V.NR
7 HAVING COUNT(DISTINCT V.NC) = (SELECT COUNT (*) FROM CLIENTS)) ;
1 SELECT R.NOMR
2 FROM REPRESENTANTS R
3 WHERE
4 (SELECT COUNT(DISTINCT V.NC) FROM VENTES V WHERE V.NR=R.NR)
5 =
6 (SELECT COUNT (*) FROM CLIENTS) ;
1 SELECT R.NOMR
2 FROM REPRESENTANTS R
3 WHERE NOT EXISTS (
4 SELECT C.*
5 FROM CLIENTS C
6 WHERE NOT EXISTS (
7 SELECT V.*
8 FROM VENTES V
9 WHERE C.NC=V.NC AND V.NR=R.NR)
10 ) ;
19
Stéphane Crozat