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

Documents pareils