L3 informatique 2005-06 Conception et utilisation des bases de données Examen nal - janvier 2006 Durée de l'épreuve : 2 heures L'usage des polycopiés du cours est autorisé. Tous les autres documents, sous quelque forme que ce soit (papier, électronique ou autre) sont interdits, y compris les énoncés et corrigés des exercices des TD. Éteignez vos portables. Le barême est donné entre crochets au début de chaque question. 1 [6 pts] On reprend la base utilisée dans le cours et dans les TP : EMP(matr, nome, poste, datemb, sup, salaire, commission, dept) DEPT(dept, nomd, lieu) PROJET(codeP, nomp) PARTICIPATION(matr, codep, fonctionp) On rappelle que sup est le matricule du supérieur de l'employé. Vous allez donner les ordres SQL pour obtenir les informations suivantes. Pour chaque question ne donnez plusieurs ordres SQL que si vous ne savez pas répondre en donnant un seul ordre SQL. Essayez de donner des ordres SQL respectant la norme SQL2 et portables sur le plus nombre de SGBDs. (a) Matricules des employés dont au moins un subordonné participe à un projet. Précision : Jacques est le subordonné de Paul si et seulement si Paul est le supérieur de Jacques. (b) Noms des départements qui n'ont aucun employé qui a le poste de comptable. (c) Noms des départements, suivis du total des salaires des employés qui travaillent dans ce département pour tous les départements dont le total des salaires est inférieur strictement à 30000 euros. Si le département n'a pas d'employés, il sera aché 0 à la suite du nom du département. (d) Noms des employés qui participent à au moins tous les projets auxquels participe l'employé de nom Dupond. Pour cette requête vous donnerez d'abord la solution sous la forme d'une suite d'opérations de l'algèbre relationnelle, avant de donner l'ordre SQL. 2 [2 pts] Vous êtes administrateur de la base de données des employés utilisée dans l'exercice précédent. Vous souhaitez enregistrer les noms des utilisateurs qui modient les salaires des employés, et la date où la modication a été faite (seulement ces 2 informations). Décrivez tout ce que vous allez faire pour cela. Écrivez le code dont vous aurez besoin ; le code nécessaire à la création éventuelle de tables ne vous est pas demandé. 3 [2 pts] (a) Dessinez un B-arbre d'ordre 1 (au moins 1, et au plus 2 clés par page) après l'insertion des nombres suivants : 78, 56, 45, 80, 36, 89, 40, 12, 8. (b) Dessinez le même arbre après la suppression du nombre 40.
4 [4 pts] Soit la relation suivante qui respecte la 1NF : R(A, B, C, D, E, F). Soient les dépendances suivantes : A, B, C D, F C F D E Passez cette relation en forme normale la plus élevée. Montrez, pour chaque passage à une forme normale suivante, qu'il n'y a pas de perte de dépendance. Pour chaque forme normale, expliquez le but et la méthode de modication de la base, en plus du résultat. Si une forme normale est déjà respectée et ne nécessite donc aucune modication de votre base, expliquez pourquoi. 5 [6 pts] Pour cette question, utilisez la base donnée dans le sujet en exercice 1. En SQL : (a) Créez une table CLIENT avec les attributs numéro, nom, prénom et contact, le contact étant l'employé qui est le correspondant privilégié du client dans l'entreprise. Utilisez des types d'attributs pertinents et posez les contraintes adéquates. (b) Supprimez tous les employés du département d'informatique. (c) Augmentez de 10 % le salaire de tous les employés des projets Logiciels libres et Applicatifs clients qui gagnent moins de 1000 euros, commission comprise. Attention : la colonne commission peut avoir des cases vides ; en ce cas vous considérerez que l'employé n'a pas de commission.
1 Maîtrise Informatique 2005-06 Langage SQL Correction des exercices de l'examen de janvier 2006 (a) select distinct superieur.matr from emp superieur join emp sub on sub.sup = superieur.matr where sub.matr in (select matr from participation) (b) select nomd from dept where dept not in (select dept from emp where poste = 'COMPTABLE') (c) select nomd, nvl(sum(sal), 0) Total from dept left outer join emp on dept.dept = emp.dept group by nomd having nvl(sum(sal), 0) < 30000 (d) Algèbre relationnelle : 2 Il faut A Div(codeP) B où B = ((Participation J{matr} Emp) / nome ='Dupond' )[codep] et A = Participation J{matr} Emp [nome, codep] select nome from emp where not exists (select codep from participation P where matr = (select matr from emp where nome = 'DUPOND') and not exists (select null from participation where matr = emp.matr and codep = P.codeP)) (a) Créer une table pour contenir les informations (2 colonnes nom et date- Modif) : create table modifsalaire (utilisateur varchar(30) not null, datemodif date not null (b) Créer un trigger qui est déclenché quand une ligne est modiée.***seulement le salaire**** CREATE OR REPLACE TRIGGER modifsalaire AFTER UPDATE OF sal ON emp FOR EACH ROW insert into modifsalaire(utilisateur, datemodif) values(user, sysdate)
3 4 (a) 56 12;40 80 8 36 45 78 89 (b) 56 12 80 8 36;45 78 89 *** Simplification des DF : A, B, C -> D C -> F D -> E *** Clés candidates? A, B, C *** 2NF? Non. R(A*, B*, C*, D, E, F) devient R1(A*, B*, C*, D, E) R2(C*, F) 2NF OK. Pas de perte. *** 3NF? Non. R1(A*, B*, C*, D, E) devient R11(A*, B*, C*, D) R12(D*, E) plus R2(C*, F) 3NF OK. Pas de perte. *** BCNF OK? Oui. *** 4NF OK?
Oui. *** 5NF OK? Oui. *** Résultat : R1(A*, B*, C*, D) R2(D*, E) R3(C*, F) 5 CREATE TABLE CLIENT ( numero INTEGER PRIMARY KEY, nom VARCHAR(30) NOT NULL, prenom VARCHAR(30), contact INTEGER CONSTRAINT CLIENT_REF_EMP REFERENCES EMP(matr) Supprimez tous les employés du département d'informatique. DELETE FROM TABLE EMP WHERE dept IN ( SELECT dept FROM DEPT WHERE nomd = 'Informatique' Augmentez de 10 % le salaire... UPDATE EMP SET salaire = salaire + 0.1 * salaire WHERE salaire + nvl(commission, 0) < 1000 AND matr IN ( SELECT matr FROM PARTICIPATION NATURAL JOIN PROJET WHERE PROJET.nomP = 'Logiciels libres' OR PROJET.nomP = 'Applicatifs clients'