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;