pdf - Index of
Transcription
pdf - Index of
IR1- 2009-10 – Base de données - TD#4 A.. Connectez-vous sur: http://etudiant.univ-mlv.fr/connect/index.html si ce n'est pas fait, activez votre base postgresql : Activer sa base de données PostgreSQL puis cliquez sur “phpPgAdmin” votre base. Sélectionnez la base “nomdeCompte_db” Cliquez sur SQL (barre de tâches de phppgadmin, à côté de schéma). 1. Dans un premier temps, vous devez créer les tables du schéma suivant: Employee (ssn, fname, lname, minit, bdate, address, sex, salary, #dno, #superssn) Department (dnumber, dname, #mgrssn, mgrstartdate) Dept_location (#dnumber,dlocation) Project (pnumber, pname, plocation, #dnum) Works_on (#essn, #pno, hours) Dependent (#essn, dependent, sex, bdate, relationship) 2.Trouver un ordre de supppression de toutes les tables (drop table). Copier les instructions drop table en début de votre fichier company.sql B. Rédiger en SQL les requêtes suivantes (idem TD#2) : 1.Donner le nom, le prénom et l'adresse des employés qui travaillent dans le département 'Research'. 2.Pour chaque projet localisé à 'Strafford', fournir le numéro du projet, le département responsable du projet et les renseignements (nom, prénom, adresse et date de naissance) du manager de ce département. 3.Fournir une liste des numéros de projets qui employent un personne dont le nom de famille est 'Smith'. 4.Fournir le nom et le prénom des employés qui n'ont personne à leur charge ('dependents'). 5.Fournir le nom et le prénom des responsables ('manager') qui ont au moins un personne à leur charge. 6.Fournir le nom et le prénom des employés du département 5 qui ont travaillés plus de 10 heures sur le projet 'ProductX'. 7. Trouver le nom et le prénom des employés qui travaillent sur tous les projets du département numéro 5. Correction en algèbre relationnel A. drop table works_on; drop table project; drop table dependent; drop table dept_locations; alter table department drop constraint dep_fk1; drop table employee; drop table department; B. 1. dep_rech = σ dname='research' (department) emp_rech = (dep_rech dnumber=dno employee) resultat = ∏ (emp_rech) fname, lname, adress SELECT fname, lname, address FROM department, employee WHERE dname like 'research' AND dnumber = dno; 2. proj_strafford = σ plocation='strafford' (project) dep_stra = (proj_strafford dnum=dnumber department) dep_resp = (dep_stra mgrssn=ssn employee) resultat = ∏ pnumber,dnum,lname,address, bdate (dep_resp) SELECT pnumber, dnum, lname, fname, address,bdate FROM project, department, employee WHERE plocation like 'Strafford' AND dnum=dnumber AND mgrssn = ssn; 3 smith_nss = ∏ ssn ( σ smith_W_proj = ∏ resp = ∏ lname,dnumber smith_resp = ∏ pno (employee)) lname='smith' (smith_nss ssn=essn works_on) (employee ssn=mgrssn department) dnumber smith_M_proj = ∏ project) ( σ pnumber (resp) lname='smith' (smith_resp dnumber=dnum resultat = smith_W_proj ∪ smith_M_proj SELECT DISTINCT pnumber FROM employee, department, project WHERE lname like 'Smith' AND dnum=dnumber AND mgrssn=ssn UNION (SELECT DISTINCT pnumber FROM employee, works_on WHERE lname='Smith' AND ssn=essn AND pnumber=pno); OU SELECT DISTINCT pnumber FROM project WHERE pnumber IN (SELECT pnumber FROM project, department,employee WHERE lname like 'Smith' AND dnum=dnumber AND mgrssn=ssn) OR pnumber IN (SELECT pno FROM works_on, employee WHERE lname like 'Smith' AND essn=ssn); 4. emps = ∏ ( employee) ssn emp_char = ∏ ( dependents) essn emp_char_ssn = ρ ssn (emp_char) emp_sans_charge = emps emp_char_ssn resultat = ∏ employee) (emp_sans_charge * lname, fname SELECT fname, lname FROM employee WHERE NOT EXISTS (SELECT * FROM dependent WHERE SSN=ESSN); 5. resp = ρ ssn (∏ emp_char = ρ mgrssn ssn ( department)) (∏ essn ( dependents)) resp_char = (resp ∩ emp_char) resultat = ∏ (resp_char * employee) lname, fname SELECT fname, lname FROM employee WHERE EXISTS (SELECT * FROM dependent WHERE SSN=ESSN) AND EXISTS (SELECT * FROM department WHERE ssn=mgrssn); 6. R7a = ∏ pnumber (project)) pname='ProductX' ( σ R7b = ∏ pno,esss R7c = ∏ essn R7d = σ dno=5 R7 = ∏ ( σ (works_on)) phours>10 ( R7b pno=pnumber R7a) (employee ssn=essn R7c) fname,lname (R7d) SELECT fname, lname FROM employee e, project p, works_on w WHERE p.pname like 'ProductX' AND w.hours>10 AND w.pnumber=p.pno AND e.ssn=w.essn; 7. dep5_proj = ∏ emp_proj = ∏ ( σ pnumber dnum=5 (project)) (works_on) essn, pno res_emp_nss = emp_proj ÷ dep5_proj resultat = ∏ employee) SELECT lname, fname FROM employee (res_emp_nss essn=ssn lname, fname WHERE NOT EXISTS ((SELECT pnumber FROM project WHERE dno=5) EXCEPT (SELECT pno FROM works_on WHERE essn=ssn)); Explication des requêtes de la question 3: SELECT lname, fname FROM employee WHERE NOT EXISTS ((SELECT pnumber FROM project WHERE dno=5) EXCEPT (SELECT pno FROM works_on WHERE essn=ssn)); Smith :3; Wong : 1, 2; Réécriture de l'énoncé : Sélectionner chaque employé pour lequel il n'existe pas un projet contrôlé par le département numéro 5 pour lequel cet employé ne travaille pas. SELECT lname, fname FROM employee WHERE NOT EXISTS (SELECT * FROM works_on w WHERE (w.pno IN (SELECT pnumber FROM project WHERE dnum=5)) AND NOT EXISTS (SELECT * FROM works_on v WHERE v.essn=ssn AND v.pno=w.pno));