Cours - TD - TP de SQL

Transcription

Cours - TD - TP de SQL
TP 2 - CORRIGE
Base Empdept
1. Chargement de la BD
2. Faites une augmentation de salaire de 20% à tous les employés du département 20
Select *
From emp
Where ND = 20;
+------+-------+---------+------------+---------+------+----+--------+
| NE
| NOM
| JOB
| DATEMB
| SAL
| COMM | ND | NEchef |
+------+-------+---------+------------+---------+------+----+--------+
| 7369 | SMITH | CLERK
| 1980-12-17 | 800.00 | NULL | 20 |
7902 |
| 7566 | JONES | MANAGER | 1981-04-02 | 2975.00 | NULL | 20 |
7839 |
| 7788 | SCOTT | ANALYST | 1982-12-09 | 3000.00 | NULL | 20 |
7566 |
| 7876 | ADAMS | CLERK
| 1983-01-12 | 1100.00 | NULL | 20 |
7788 |
| 7902 | FORD | ANALYST | 1981-12-03 | 3000.00 | NULL | 20 |
7566 |
+------+-------+---------+------------+---------+------+----+--------+
5 rows in set (0.01 sec)
Update emp
set sal=sal*1.2
where ND=20;
3. Augmenter la commission de 200 à tous les vendeurs de Chicago. Commencer par faire une
requêtes de recherche des tuples concernés.
select E.NE, E.nom, E.job, E.comm, D.ville
from emp E, dept D
where E.ND=D.ND
and D.ville="Chicago"
and E.job="Salesman";
+------+--------+----------+---------+---------+
| NE
| nom
| job
| comm
| ville
|
+------+--------+----------+---------+---------+
| 7499 | ALLEN | SALESMAN | 300.00 | CHICAGO |
| 7521 | WARD
| SALESMAN | 500.00 | CHICAGO |
| 7654 | MARTIN | SALESMAN | 1400.00 | CHICAGO |
| 7844 | TURNER | SALESMAN |
0.00 | CHICAGO |
+------+--------+----------+---------+---------+
4 rows in set (0.00 sec)
update emp E, dept D
set E.comm=E.comm+200
where E.ND=D.ND
and D.ville="Chicago"
and E.job="Salesman";
4. Essayer de créer l’employé Dupond, qui vient d’être embauché, dont le numéro d’employé
est 7839. On n’a pas plus d’informations le concernant. Quel problème cela pose-t-il ?
Insert into emp (NE, nom) values (7839,'DUPOND');
ERROR 1364 (HY000): Field 'ND' doesn't have a default value
L’attribut ND est obligatoire
5. Essayer de créer l’employé Dupond, qui vient d’être embauché, dont le numéro d’employé
est 7839 et qui travaille dans le département 10. Quel problème cela pose-t-il ? Comment
pouvez-vous le résoudre ?
Insert into emp (NE, nom, ND) values (7839,'DUPOND', 10);
ERROR 1062 (23000): Duplicate entry '7839' for key 1
L’attribut NE est primary key or le 7839 existe déjà.
Pour résoudre le problème, on peut utiliser l’auto-incrément ou proposer un numéro pour
NE qui n’existe pas déjà.
6. Essayer de supprimer le département 10. Quel problème cela pose ?
delete from dept where nd=10;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key
constraint fails (`empdept/emp`, CONSTRAINT `emp_ibfk_1` FOREIGN KEY (`ND`)
REFERENCES `
Il y a des gens qui travaillent dans le département 10. On ne peut donc pas le supprimer.
7. Essayer de supprimer l’employé n° 7698. Quel problème cela pose ?
delete from emp where ne=7698;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key
constraint fails (`empdept/emp`, CONSTRAINT `emp_ibfk_2` FOREIGN KEY
(`NEchef`) REFERENCES `emp` (`NE`))
Il y a des gens qui travaillent sous la responsabilité du 7698. On ne peut donc pas le
supprimer.
8. Créer l’employé DUPOND. Son numéro est le 8000. Il est MANAGER. Sa date
d’embauche est : aujourd’hui. Son salaire est 2500. Il n’a pas de commission. Son supérieur
hiérarchique est le Président. Il travaille dans le département 30. TURNER (7844) et
JAMES (7900) passe sous sa responsabilité. Ecrivez le script de mise à jour de la base de
données. Exécuter ce script.
Insert into emp values (8000,'DUPOND','MANAGER',now(),2450,NULL, 30, 7839);
update emp
set NEchef=8000
where NE in (7844, 7900);
9. Dupond et les employés sous sa responsabilité travaille désormais dans le département 40.
Ecrivez le script de mise à jour de la base de données.
Select * from emp
Where NE=8000 or Nechef=8000;
Update emp
Set ND=40
Where NE=8000 or Nechef=8000;
10. BLAKE (7698) démissionne. Tous les employés sous sa responsabilité passent sous celle
de DUPOND et dans son département. Son département est supprimé. Tous les employés
de son département passent dans le département de DUPOND. Ecrivez le script de mise à
jour de la base de données. Dans le script on commencera par lister tous les subordonnés de
BLAKE et tous les employés de son département.
Select *
from emp
where NEchef = 7698;
+------+--------+----------+------------+---------+---------+----+--------+
| NE
| NOM
| JOB
| DATEMB
| SAL
| COMM
| ND | NEchef |
+------+--------+----------+------------+---------+---------+----+--------+
| 7499 | ALLEN | SALESMAN | 1981-02-20 | 1600.00 | 500.00 | 30 |
7698 |
| 7521 | WARD
| SALESMAN | 1981-02-22 | 1250.00 | 700.00 | 30 |
7698 |
| 7654 | MARTIN | SALESMAN | 1981-09-28 | 1250.00 | 1600.00 | 30 |
7698 |
+------+--------+----------+------------+---------+---------+----+--------+
3 rows in set (0.00 sec)
update emp
set NEchef=8000, ND=40
where NEchef = 7698;
delete from emp
where NE = 7698;
delete from dept
where ND = 30;
11. Ajouter un nouveau département. Il est à PARIS. Son nom est « INFO ». Passer tous les
employés du département 20 dans ce département.
Insert into dept values (NULL, „INFO‟, „PARIS‟);
Select * from dept;
+----+------------+----------+
| ND | NOM
| VILLE
|
+----+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH
| DALLAS
|
| 40 | OPERATIONS | BOSTON
|
| 41 | INFO
| PARIS
|
+----+------------+----------+
4 rows in set (0.00 sec)
Base Biblio
1. Charger la base biblio.
2. Corriger les erreurs : expliquer les corrections que vous apportez.
Les tables ne sont pas créées dans le bon ordre.
3. Combien y a-t-il de tuples dans la table résultat de la requête suivante juste après exécution
du script de création des tables et des tuples (mettez la formule de calcul plutôt que le
résultat).
Select *
from emprunter E, livres L, adherents A
where E.NL = L.NL
and E.NA = A.NA;
Il y a autant de tuples que dans la table emprunter
4. Combien y a-t-il d’attributs dans la table résultat de la requête précédente ?
Le nombre d’attributs de emprunter + celui de livres + celui de adherents
5. Quelle est la clé primaire de la table résultat de la requête précédente ?
NL, datemp : la clé primaire de la table emprunter
6. Combien y-t-il de tuples dans la table résultat de la requête suivante juste après exécution
du script de création des tables et des tuples (mettez la formule de calcul plutôt que le
résultat).
Select *
from emprunter E, livres L, oeuvres O;
Nb tuples(emprunter) * Nb tuples(livres) * Nb tuples(œuvres)
7. Combien y a-t-il d’attributs dans la table résultat de la requête précédente ?
Le nombre d’attributs de emprunter + celui de livres + celui de adherents
8. Quelle est la clé primaire de la table résultat de la requête précédente ?
La concaténation des clés primaires des 3 tables :
E.NL, E.datemb, L.NL, O.NO
9. Quels sont les livres actuellement empruntés ?
Select E.NL, O.titre, E.dateret
From emprunter E, livres L, oeuvres O
Where E.NL = L.NL
And L.NO=O.NO
And E.dateret is NULL;
10. Quels sont les livres empruntés par Jeanette Lecoeur ? Vérifier dans la réponse qu’il n’y a
pas d’homonymes.
Select E.NL, O.titre, A.NA, A.nom, dateret
From emprunter E, livres L, adherents A, oeuvres O
Where E.NL = L.NL
And E.NA = A.NA
And L.NO=O.NO
And UPPER(A.nom) = „LECOEUR‟
And UPPER(A.prenom) = „JEANETTE‟
And E.dateret is NULL;
11. Tous les livres empruntés le mois dernier
Select E.NL, O.titre, datemp
From emprunter E, livres L, oeuvres O
Where E.NL = L.NL
And L.NO=O.NO
And year(E.datemp) = 2008
And month (E.datemp) = 08;
12. Tous les adhérents qui ont emprunté un livre de Dostoievski
Select distinct A.NA, A.nom
From emprunter E, livres L, adherents A, oeuvres O
Where E.NL = L.NL
And E.NA = A.NA
And L.NO=O.NO
And UPPER(O.auteur) like „%DOSTOIEVSKI‟;
15. La bibliothèque vient d’acquérir un nouveau exemplaire de : « Au cœur des ténèbres » de
Joseph Conrad, chez Gallimard. Faire la mise à jour de la BD.
Select *
From oeuvres
Where UPPER(Titre) like “AU%UR%BRES”;
Insert into livres values (NULL, „Folio‟, id d‟oeuvre trouvé);
16. Ecrire les commandes qui permettent de retirer tout ce que vous avez ajouté.
Select *
From oeuvres
Where UPPER(Titre) like “AU%UR%BRES”;
Select *
From livres
Where NO = numéro d‟oeuvre trouvé;
A partir de là, il faut trouver le bon numéro de livres à supprimer.
Delete from livres
Where NO = numéro de livre trouvé.
17. La bibliothèque vient d’acquérir un nouveau livre de Hermann Hesse intitulé « Siddhartha »
chez Folio. Faire la mise à jour de la BD.
Select NO, titre
From oeuvres
Where UPPER(Titre) like “%SIDD%”;
Insert into oeuvres values (NULL, „Siddhartha’, ‘Hermann Hesse‟);
Insert into livres values (NULL, „Folio‟, Last_insert_id()) ;
18. Ecrire les commandes qui permettent de retirer tout ce que vous avez ajouté.
Select *
From oeuvres
Where UPPER(Titre) like “%SIDD%”;
Permet de récupérer un n° d’œuvre.
Delete from livres
Where NO = numéro d‟oeuvre trouvé;
Delete from oeuvres
Where NO = numéro d‟oeuvre trouvé;
19. Un nouvel adhérent vient s’inscrire : Olivier DUPOND, 76, quai de la Loire, 75019 Paris,
téléphone :
Insert into adherents values (NULL, „DUPOND‟, „Olivier‟, „76, quai de la
Loire, 75019 Paris‟, NULL) ;
20. Martine CROZIER vient emprunter « Au cœur des ténèbres » que vous venez d’ajouter et
Le rouge et le noir chez Hachette, livre n°23. Faire les mises à jour de la BD.
Select NA, Nom, Prenom
from adherents
Where upper(nom)=‟CROZIER‟
And upper(prenom)=‟MARTINE‟;
Il faut trouver le numéro d’adhérent de Martine CROZIER (attention, il peut y avoir des
homonymes).
Insert into emprunter
values (n° du “Coeur des ténèbres” qu‟on vient d‟ajouter, current_date,
current_date+14, NULL, n° de Martine);
Insert into emprunter
values (23, current_date, current_date+14, NULL, n°de Martine);
21. M. Cyril FREDERIC ramène les livres qu’il a empruntés. Faire la mise à jour de la BD.
Select NA, Nom, Prenom
from adherents
Where upper(nom)=‟FREDERIC‟
And upper(prenom)=‟CYRIL‟;
+----+----------+--------+
| NA | Nom
| Prenom |
+----+----------+--------+
| 28 | Frederic | Cyril |
+----+----------+--------+
Select * from emprunter
Where dateret is NULL
And NA = 28;
+----+------------+------------+---------+----+
| NL | datEmp
| datRetMax | dateRet | NA |
+----+------------+------------+---------+----+
| 2 | 2007-10-06 | 2007-10-20 | NULL
| 28 |
| 9 | 2007-10-06 | 2007-10-20 | NULL
| 28 |
+----+------------+------------+---------+----+
Update emprunter
Set dateret = current_date
Where dateret is NULL
And NL = 2;
update emprunter
Set dateret = current_date
Where dateret is NULL
And NL = 9;
22. M. Cyril FREDERIC essaye d’emprunter le livre n°23. Que constatez vous ?
Insert into emprunter
Values (23, current_date(), 14, NULL, 28);
On ne peut pas ajouter ce tuple car le livre est déjà sorti ce même jour.
23. M. Cyril FREDERIC essaye d’emprunter le livre n°29. Que constatez vous ?
Insert into emprunter
Values (29, current_date(), 14, NULL, 28);
On peut ajouter ce tuple bien que le livre soit déjà sorti !
Select * from emprunter order by NL ;
| 29 | 2007-09-01 |
| 29 | 2008-11-01 |
14 | NULL
14 | NULL
| 27 |
| 28 |
La BD ne garantit pas ce type d’erreur. Une vérification niveau serveur (trigger) ou niveau
application devra être effectuée.
24. Quels sont le ou les auteurs du titre « Voyage au bout de la nuit »
Select distinct auteur
From oeuvres
Where UPPER(titre) = „VOYAGE AU BOUT DE LA NUIT‟;
25. Quels sont les ou les éditeurs du titre « Narcisse et Goldmund »
Select distinct L.editeur
From livres L, oeuvres O
Where L.NO=O.NO
And UPPER(O.titre) like „NARCISSE ET GOLDMUND‟;
26. Quels sont les adhérents actuellement en retard ?
Select distinct A.NA, A.nom
From emprunter E, livres L, adherents A, oeuvres O
Where E.NL = L.NL
And E.NA = A.NA
And L.NO=O.NO
And E.dateret is NULL
And to_days(current_date) > to_days(E.datemp) + 14;
27. Quels sont les livres actuellement en retard ?
Select E.NL, O.titre, dateret, datemp,current_date
From emprunter E, livres L, oeuvres O
Where E.NL = L.NL
And L.NO=O.NO
And E.dateret is NULL
And to_days(current_date) > to_days(E.datemp) + 14;
28. Quels sont les adhérents en retard avec le nombre de livre en retard et la moyenne du
nombre de jour de retard.
Select A.NA, A.nom, count(*),avg(to_days(current_date)- to_days(E.datemp) –
14) as moy_retard
From emprunter E, livres L, adherents A, oeuvres O
Where E.NL = L.NL
And E.NA = A.NA
And L.NO=O.NO
And E.dateret is NULL
And to_days(current_date) > to_days(E.datemp) + 14
Group by A.NA, A.nom;
29. Nombre de livres empruntées par auteur.
Select O.auteur, count(*)
From emprunter E, livres L, oeuvres O
Where E.NL = L.NL
And L.NO=O.NO
Group by O.auteur;
30. Nombre de livres empruntés par éditeur.
Select L.editeur, count(*)
From emprunter E, livres L
Where E.NL = L.NL
Group by L.editeur;
31. Durée moyenne d’emprunt. On commencera par afficher les durées des emprunts rendus
triés par date d’emprunt
Select NL,datemp, dateret,(to_days(dateret)-to_days(datemp)) duree
From emprunter
Where dateret is not null
Order by datemp;
Select avg(to_days(dateret)-to_days(datemp))
From emprunter
Where dateret is not null;
32. Durée moyenne des retards pour l’ensemble des emprunts.
Test : afficher le nombre de jours de retard, 0 pour ceux qui ne sont pas en retard.
Select if(
to_days( ifnull(dateret, current_date) ) - to_days(datemp) –dureemax > 0,
to_days( ifnull(dateret, current_date) ) - to_days(datemp) –dureemax ,
0
)
retard, datemp, dateret
from emprunter;
Pour la moyenne, il suffit d’ajouter un AVG
Select AVG (if(
…
)
) moyenne
from emprunter;
33. Durée moyenne des retards parmi les seuls retardataires.
Select AVG (if(
…
)
) moyenne
from emprunter
where dateret is null;