Vous êtes sur la page 1sur 19

Questions complexes en

SQL

stph.scenari-community.org/bdd
sql5.pdf

Stéphane Crozat

Paternité - Partage des Conditions Initiales à l'Identique : http://creativecommons.org 30 janvier 2018


/licenses/by-sa/4.0/fr/
Table des
matières
I - Cours 3

1. Imbrication de requêtes en SQL ..................................................................................................................... 3


1.1. Requêtes imbriquées ..................................................................................................................................................................... 3
1.2. Sous-requête d'existence IN .......................................................................................................................................................... 3
1.3. Sous-requête d'existence EXISTS .................................................................................................................................................. 4
1.4. Sous-requête de comparaison ALL ............................................................................................................................................... 5
1.5. Sous-requête de comparaison ANY .............................................................................................................................................. 6
1.6. Sous-requêtes dans la clause FROM ............................................................................................................................................. 6

II - Exercice 8

1. Exercice : Gestion de bus II ............................................................................................................................ 8

2. Exercice : Gestion de bibliothèques ................................................................................................................ 8

3. Exercice : Re-re-re-représentation de représentants (épisode ultime) ............................................................ 9

III - Devoir 13

1. Exercice : Re-re-représentation de représentants .......................................................................................... 13

Solutions des exercices 16


Cours

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.

1.1. Requêtes imbriquées

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.

Synonymes : Sous-question, Requête imbriquée

Syntaxe : Requêtes imbriquées par la clause WHERE

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)

1.2. Sous-requête d'existence IN

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.

Exemple : Sous-requête IN à une colonne et plusieurs lignes

1 SELECT Chercheur.Nom
2 FROM Chercheur
3 WHERE Chercheur.Universite IN
4 (SELECT Universite.Nom
5 FROM Universite
6 WHERE Universite.Ville='Paris')

Exemple : Sous-requête IN à plusieurs colonnes et plusieurs lignes

1 SELECT N°SS
2 FROM Chercheur
3 WHERE (Nom, Prenom, Age) IN
4 (SELECT Nom, Prenom, Age
5 FROM Enseignant)

Exemple : Imbrication multiple de requêtes

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 : Jointure par la sous-requête IN


La sous-requête IN est une troisième voie, avec les clauses WHERE et JOIN, pour réaliser des jointures entre
relations. On préfèrera néanmoins éviter d'utiliser à cette unique fin cette version plus procédurale.

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.

1.3. Sous-requête d'existence EXISTS

Introduction

Cette sous-requête permet de vérifier que la sous-requête contient au moins un tuple.

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)

Remarque : Projection dans la sous-requête


Puisque la sous-requête n'est destinée qu'à valider l'existence d'un tuple, il est inutile de procéder à une
projection particulière pour cette sous-requête. On utilise donc en général la clause SELECT * pour une sous-
requête avec une clause EXISTS.

Remarque : NOT EXISTS


On peut tester la non présence de tuple dans la sous-requête en utilisant la clause NOT EXISTS à la place de la
clause EXISTS.

1.4. Sous-requête de comparaison ALL

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

1.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.

1.6. Sous-requêtes dans la clause FROM


Il est possible de raffiner progressivement une requête en enchaînant les questions dans la clause FROM. Ceci
est une alternative à la création de vue.

Syntaxe

1 SELECT ... FROM


2 (SELECT ...
3 FROM ...
4 WHERE ...)
5 WHERE ...

Remarque : Sous-sous requête


Il est possible d'imbriquer successivement plusieurs sous-requêtes.

1 SELECT ... FROM


2 (SELECT ... FROM
3 (SELECT...
(
4 FROM ...
5 WHERE)
6 WHERE ...)
7 WHERE ...

6
Sous-requêtes dans la clause FROM

Syntaxe : Jointure de sous-requêtes


Il est possible de faire le produit ou la jointure de sous-requêtes.

1 SELECT ... FROM


2 (SELECT ... FROM
3 WHERE...) R1,
4 (SELECT ... FROM
5 WHERE...) R2
6 WHERE R1... = R2...

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).

Exemple : Enchaînement de calculs d'aggrégat

1 SELECT AVG(c)
2 FROM (SELECT COUNT(b) AS c FROM t GROUP BY a)

Exemple : Calcul de la moyenne des ventes par jour de la semaine

1 SELECT AVG(q) FROM


2 (SELECT jds AS jds, COUNT(*) AS q
3 FROM ventes v
4 GROUP BY jds)

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.

1 Conducteur (#matricule:varchar(10), nom:varchar, prénom:varchar)


2 Ligne (#num:numeric(2), km:numeric(4))
3 Bus (#immat:varchar(10), type:{Soufflets|Normaux|Réduits}, kilométrage:numeric
(7), matricule=>Conducteur)
4 TrajetParJour (#ligne=>Ligne, #immat=>Bus, nombre_de_trajets:numeric(2))
5 Station (#num:numeric, nom:varchar, adresse:varchar)
6 Arrêt (#ligne:=>Ligne, #station=>Station, rang:numeric)

Question [solution n°1 p.16]


[* ]

Quelles lignes (numéros) ont pour arrivée la station "Royallieu".

2. Exercice : Gestion de bibliothèques


[30 min]
Soit la base relationnelle suivante permettant de gérer des bibliothèques.

1 Livre (#LivreID, Titre, NomEditeur=>Editeur) avec Titre clé


2 Livre_Auteur (#LivreID=>Livre, #NomAuteur)
3 Editeur (#NomEditeur, Adresse, Telephone)
4 Livre_Exemplaires (#LivreID=>Livre, #BiblioID=>Bibliotheque, NbExemplaires)
5 Bibliotheque (#BiblioID, Nom, Adresse) avec Nom clé
6 Livre_Emprunte (#LivreID=>livre, #BiblioID=>Bibliotheque, #NumCard=>Emprunteur,
DateEmprunt, DateRetour)
7 Emprunteur (#NumCard, Nom, Adresse, Téléphone)

Question 1 [solution n°2 p.16]


[* ]

É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".

Question 2 [solution n°3 p.16]


[* ]

É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)

Question 3 [solution n°4 p.16]


[*]

É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').

Question 4 [solution n°5 p.16]


[*]

É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.

Question 5 [solution n°6 p.17]


[*]

É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.

3. Exercice : Re-re-re-représentation de représentants (épisode ultime)


[1 h]
Soit la base de données suivante :

1 REPRESENTANTS (#NR, NOMR, VILLE)


2 PRODUITS (#NP, NOMP, COUL, PDS)
3 CLIENTS (#NC, NOMC, VILLE)
4 VENTES (#NR=>REPRESENTANTS(NR), #NP=>PRODUITS(NP), #NC=>CLIENTS(NC), QT)

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)

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
37 INSERT INTO REPRESENTANTS (NR, NOMR, VILLE) VALUES (1, 'Stephane', 'Lyon');
38 INSERT INTO REPRESENTANTS (NR, NOMR, VILLE) VALUES (2, 'Benjamin', 'Paris');
39 INSERT INTO REPRESENTANTS (NR, NOMR, VILLE) VALUES (3, 'Leonard', 'Lyon');
40 INSERT INTO REPRESENTANTS (NR, NOMR, VILLE) VALUES (4, 'Antoine', 'Brest');
41 INSERT INTO REPRESENTANTS (NR, NOMR, VILLE) VALUES (5, 'Bruno', 'Bayonne');
42
43 INSERT INTO PRODUITS (NP, NOMP, COUL, PDS) VALUES (1, 'Aspirateur', 'Rouge', 3546
);
44 INSERT INTO PRODUITS (NP, NOMP, COUL, PDS) VALUES (2, 'Trottinette', 'Bleu', 1423
);
45 INSERT INTO PRODUITS (NP, NOMP, COUL, PDS) VALUES (3, 'Chaise', 'Blanc', 3827);
46 INSERT INTO PRODUITS (NP, NOMP, COUL, PDS) VALUES (4, 'Tapis', 'Rouge', 1423);
47
48 INSERT INTO CLIENTS (NC, NOMC, VILLE) VALUES (1, 'Alice', 'Lyon');
49 INSERT INTO CLIENTS (NC, NOMC, VILLE) VALUES (2, 'Bruno', 'Lyon');
50 INSERT INTO CLIENTS (NC, NOMC, VILLE) VALUES (3, 'Charles', 'Compiègne');
51 INSERT INTO CLIENTS (NC, NOMC, VILLE) VALUES (4, 'Denis', 'Montpellier');
52 INSERT INTO CLIENTS (NC, NOMC, VILLE) VALUES (5, 'Emile', 'Strasbourg');
53
54 INSERT INTO VENTES (NR, NP, NC, QT) VALUES (1, 1, 1, 1);
55 INSERT INTO VENTES (NR, NP, NC, QT) VALUES (1, 1, 2, 1);
56 INSERT INTO VENTES (NR, NP, NC, QT) VALUES (2, 2, 3, 1);
57 INSERT INTO VENTES (NR, NP, NC, QT) VALUES (4, 3, 3, 200);
58 INSERT INTO VENTES (NR, NP, NC, QT) VALUES (3, 4, 2, 190);
59 INSERT INTO VENTES (NR, NP, NC, QT) VALUES (1, 3, 2, 300);
60 INSERT INTO VENTES (NR, NP, NC, QT) VALUES (3, 1, 2, 120);
61 INSERT INTO VENTES (NR, NP, NC, QT) VALUES (3, 1, 4, 120);
62 INSERT INTO VENTES (NR, NP, NC, QT) VALUES (3, 4, 4, 2);
63 INSERT INTO VENTES (NR, NP, NC, QT) VALUES (3, 1, 1, 3);
64 INSERT INTO VENTES (NR, NP, NC, QT) VALUES (3, 4, 1, 5);
65 INSERT INTO VENTES (NR, NP, NC, QT) VALUES (3, 1, 3, 1);
66 INSERT INTO VENTES (NR, NP, NC, QT) VALUES (3, 1, 5, 1);

Écrire en SQL les requêtes permettant d'obtenir les informations suivantes.

10
Exercice : Re-re-re-représentation de représentants (épisode ultime)

Question 1 [solution n°7 p.17]


[*]

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) ;

Question 2 [solution n°8 p.17]


[*]

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 (...);

Question 3 [solution n°9 p.18]


[*]

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 :

1 ville | nomr | nomr


2 -----------+---------+----------
3 Compiègne | Antoine | Leonard
4 Compiègne | Antoine | Benjamin
5 Lyon | Leonard | Stephane

11
Exercice : Re-re-re-représentation de représentants (épisode ultime)

Question 4 [solution n°10 p.18]


[* ]

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 REPRESENTANTS (#NR, NOMR, VILLE)


2 PRODUITS (#NP, NOMP, COUL, PDS)
3 CLIENTS (#NC, NOMC, VILLE)
4 VENTES (#NR=>REPRESENTANTS(NR), #NP=>PRODUITS(NP), #NC=>CLIENTS(NC), QT)

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

37 INSERT INTO REPRESENTANTS (NR, NOMR, VILLE) VALUES ( 1, 'Stephane', 'Lyon');


38 INSERT INTO REPRESENTANTS (NR, NOMR, VILLE) VALUES ( 2, 'Benjamin', 'Paris');
39 INSERT INTO REPRESENTANTS (NR, NOMR, VILLE) VALUES ( 3, 'Leonard', 'Lyon');
40 INSERT INTO REPRESENTANTS (NR, NOMR, VILLE) VALUES ( 4, 'Antoine', 'Brest');
41 INSERT INTO REPRESENTANTS (NR, NOMR, VILLE) VALUES ( 5, 'Bruno', 'Bayonne');
42
43 INSERT INTO PRODUITS (NP, NOMP, COUL, PDS) VALUES (1, 'Aspirateur', 'Rouge', 3546
);
44 INSERT INTO PRODUITS (NP, NOMP, COUL, PDS) VALUES (2, 'Trottinette', 'Bleu', 1423
);
45 INSERT INTO PRODUITS (NP, NOMP, COUL, PDS) VALUES (3, 'Chaise', 'Blanc', 3827);
46 INSERT INTO PRODUITS (NP, NOMP, COUL, PDS) VALUES (4, 'Tapis', 'Rouge', 1423);
47
48 INSERT INTO CLIENTS (NC, NOMC, VILLE) VALUES ( 1, 'Alice', 'Lyon');
49 INSERT INTO CLIENTS (NC, NOMC, VILLE) VALUES ( 2, 'Bruno', 'Lyon');
50 INSERT INTO CLIENTS (NC, NOMC, VILLE) VALUES ( 3, 'Charles', 'Compiègne');
51 INSERT INTO CLIENTS (NC, NOMC, VILLE) VALUES ( 4, 'Denis', 'Montpellier');
52 INSERT INTO CLIENTS (NC, NOMC, VILLE) VALUES ( 5, 'Emile', 'Strasbourg');
53
54 INSERT INTO VENTES (NR, NP, NC, QT) VALUES ( 1, 1, 1, 1);
55 INSERT INTO VENTES (NR, NP, NC, QT) VALUES ( 1, 1, 2, 1);
56 INSERT INTO VENTES (NR, NP, NC, QT) VALUES ( 2, 2, 3, 1);
57 INSERT INTO VENTES (NR, NP, NC, QT) VALUES ( 4, 3, 3, 200);
58 INSERT INTO VENTES (NR, NP, NC, QT) VALUES ( 3, 4, 2, 190);
59 INSERT INTO VENTES (NR, NP, NC, QT) VALUES ( 1, 3, 2, 300);
60 INSERT INTO VENTES (NR, NP, NC, QT) VALUES ( 3, 1, 2, 120);
61 INSERT INTO VENTES (NR, NP, NC, QT) VALUES ( 3, 1, 4, 120);
62 INSERT INTO VENTES (NR, NP, NC, QT) VALUES ( 3, 4, 4, 2);
63 INSERT INTO VENTES (NR, NP, NC, QT) VALUES ( 3, 1, 1, 3);
64 INSERT INTO VENTES (NR, NP, NC, QT) VALUES ( 3, 4, 1, 5);
65 INSERT INTO VENTES (NR, NP, NC, QT) VALUES ( 3, 1, 3, 1);
66 INSERT INTO VENTES (NR, NP, NC, QT) VALUES ( 3, 1, 5, 1);

Écrire en SQL les requêtes permettant d'obtenir les informations suivantes.

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

Pour une solution sans vue, utilisez une jointure externe.

Pour une solution sans vue, utilisez une différence.

Question 4

On souhaite les numéros des clients ayant acheté quelque chose à au moins un représentant issu de la même
ville.

Proposez une solution avec et une solution sans sous-requête.

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

Solutions des exercices

> Solution n°1 Exercice p. 8

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';

> Solution n°2 Exercice p. 8

1 R1=restriction(livre,titre="les cinq disciplines")


2 R2=jointure(R1,Livre_ Exemplaires, R1.LivreID=Livre_ Exemplaires.livreID)
3 R3=jointure(R2,biblioteque, R2.biblioID=biblioteque.biblioID)
4 R4=restriction(R3.nom="paris")
5 R5=Projection(R4,NbExemplaires)

> Solution n°3 Exercice p. 8

1 R1=jointure(Livre_Auteur,Livre_ Exemplaires, Livre_Auteur.LivreID=Livre_


Exemplaires.livreID)
2 R2=jointure(R1,biblioteque, R1.biblioID=biblioteque.biblioID)
3 R3=restriction(R2,R2.nom="paris" and R2.NomAuteur="Douglas Kennedy")
4 R4=Projection(R4,NbExemplaires)

> Solution n°4 Exercice p. 9

1 SELECT L.titre, E.nom, E.adresse


2 FROM livre l, Livre_Emprunte LE, Emprenteur E, Biblioteque B
3 WHERE l.LivreID=LE.LivreID
4 AND LE.biblioID=B.biblioID
5 AND LE.NumCard=E.NumCard
6 AND LE.DateRetour=today()
7 AND B.nom="Paris"

16
Stéphane Crozat
Solutions des exercices

> Solution n°5 Exercice p. 9

Deux hypothèses sont acceptées :

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)

> Solution n°6 Exercice p. 9

1 SELECT E.Nom, E.Adresse, count(le.livreID)


2 FROM Livre_Emprunte LE, Emprunteur E
3 WHERE LE.NumCard=E.NumCard
4 GROUP BY E.Nom, E.Adresse
5 HAVING COUNT(LE.livreID) > 5

> Solution n°7 Exercice p. 11

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

> Solution n°8 Exercice p. 11

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);

> Solution n°9 Exercice p. 11

1 CREATE VIEW VR as SELECT R.NOMR, SUM(V.QT) total, C.VILLE


2 FROM REPRESENTANTS R, VENTES V, CLIENTS C
3 WHERE R.NR = V.NR
4 AND V.NC = C.NC
5 GROUP BY R.NOMR, C.VILLE ;
6
7 SELECT R1.VILLE, R1.NOMR, R2.NOMR
8 FROM VR R1, VR R2
9 WHERE R1.VILLE = R2.VILLE
10 AND R1.total > R2.total ;

1 SELECT R1.VILLE, R1.NOMR, R2.NOMR


2 FROM (
3 SELECT R.NOMR, SUM(V.QT) total, C.VILLE
4 FROM REPRESENTANTS R, VENTES V, CLIENTS C
5 WHERE R.NR = V.NR
6 AND V.NC = C.NC
7 GROUP BY R.NOMR, C.VILLE
8 ) R1, (
9 SELECT R.NOMR, SUM(V.QT) total, C.VILLE
10 FROM REPRESENTANTS R, VENTES V, CLIENTS C
11 WHERE R.NR = V.NR
12 AND V.NC = C.NC
13 GROUP BY R.NOMR, C.VILLE
14 ) R2
15 WHERE R1.VILLE = R2.VILLE
16 AND R1.total > R2.total ;

1 SELECT DISTINCT R1.NOMR, R2.NOMR, C1.VILLE


2 FROM REPRESENTANTS R1, REPRESENTANTS R2, CLIENTS C1
3 WHERE
4 (SELECT SUM(V.QT) FROM VENTES V, CLIENTS C WHERE V.NR = R1.NR AND V.NC = C.NC
AND C.VILLE = C1.VILLE) >
5 (SELECT SUM(V.QT) FROM VENTES V, CLIENTS C WHERE V.NR = R2.NR AND V.NC = C.NC
AND C.VILLE = C1.VILLE) ;

> Solution n°10 Exercice p. 12

Avec une vue

1 CREATE VIEW vue AS


2 SELECT R.NOMR, C.NC
3 FROM REPRESENTANTS R, CLIENTS C

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

Vous aimerez peut-être aussi