Documente Academic
Documente Profesional
Documente Cultură
1
Observaţii.
Entitatea Echipa este o entitate slabă, existenţa ei fiind determinată de entitatea
Angajat cu care este asociată.
În diagrama E-A prezentată am precizat pentru fiecare entitate numai atributele
care vor constitui cheile primare în tabelele asociate.
IDangajat IDcontract
responsabil
1 N
Angajat M Contract
1
M 1 N
1 M
1
aparţine lucrează încheiat
N
M 1 1
1
Echipa Firma
IDcontract IDangajat
CUI
2
Continuare
Nr.crt. Identificator Denumirea
11. DataContr Data de început a contractului
12. DataFin Data finală a contractului
13. Firma Denumirea firmei beneficiare (firma client)
14. Cont Contul bancar al firmei beneficiare
Observaţie.
În situaţii reale dicţionarul datelor cuprinde mai multe atribute. În exemplul
prezentat am considerat numai un număr redus de atribute pentru a mări
claritatea expunerii. De exemplu, la firmele beneficiare au fost omise informaţiile
legate de datele firmei (adresa, numărul de înregistrare fiscală), de persoana de
contact cu executantul, alte clauze.
3
B. Integritatea entităţii
Valorile cheilor primare trebuie să fie unice şi nenule.
C. Integritatea referirii
Valorile cheilor externe trebuie să admită valori duplicate.
Valorile cheilor externe trebuie să figureze printre valorile cheii primare din
relaţia referită. De exemplu, să nu se poată introduce un nou contract dacă
valoarea atributului CUI nu se regăseşte în tabela FIRMA.
4
ECHIPA [IDcontract, IDangajat ]
IDcontract IDangajat
111 34
111 45
111 78
222 78
333 45
333 78
444 34
555 23
555 34
555 45
555 78
777 23
777 45
777 78
888 34
888 45
999 23
999 78
5
Schema legăturilor dintre tabelele bazei de date
Notă. Pentru toate aplicaţiile care vor fi prezentate Data curentă este 18.01.2017.
Algebră relaţională
R1 = SELECT (CONTRACT; DataContr<DATE()<DataFin)
R2 = NATURAL JOIN (R1, FIRMA; CUI)
R3 = NATURAL JOIN (R2, ANGAJAT; CodResp=IDangajat)
R4 = PROJECT (R3; IDcontract, Firma, Nume, Val)
R5 = RENAME (R4; IDcontract, Beneficiar, Responsabil_contract, Valoare)
SQL Access
SELECT IDcontract, Firma AS Beneficiar, Nume AS Responsabil_contract, Val AS Valoare
FROM Contract, Firma, Angajat
WHERE DATE() BETWEEN DataContr AND DataFin
AND Contract.CUI=Firma.CUI
AND CodResp=IDangajat;
6
Rezultatul interogării (Query1)
Raportul (report) se crează din meniul Create Report pe baza interogării (query) salvate,
cu precizarea câmpurilor din query care vor apare. Se pot realiza grupări ale datelor,
ordonări după valorile unuia sau mai multor câmpuri şi alegerea template-ului.
SQL Access
SELECT IDcontract, Firma AS Beneficiar, DataFin AS Data_finalizarii, Val AS Valoare
FROM Contract, Firma
WHERE DATE() > DataFin
AND Contract.CUI=Firma.CUI;
7
Rezultatul interogării (Query2)
SQL Access
SELECT IDcontract, Firma AS Beneficiar, Nume AS Responsabil_contract, Val AS Valoare
FROM Contract, Firma, Angajat
WHERE DATE() BETWEEN DataContr AND DataFin
AND Contract.CUI=Firma.CUI
AND CodResp=IDangajat
AND CodResp=56;
Observaţie.
Dacă se doreşte introducerea în mod conversaţional a codului responsabil:
8
SELECT IDcontract, Firma AS Beneficiar, Nume AS Responsabil_contract, Val AS Valoare
FROM Contract, Firma, Angajat
WHERE DATE() BETWEEN DataContr AND DataFin
AND Contract.CUI=Firma.CUI
AND CodResp=IDangajat
AND Cod_Responsabil=CodResp;
SQL Access
SELECT IDcontract, Firma AS Beneficiar, DataFin AS Data_finalizarii, Val AS Valoare
FROM Contract, Firma
WHERE DATE() > DataFin
AND Contract.CUI=Firma.CUI
AND Cod_Responsabil=CodResp;
9
Rezultatul interogării (Query4)
P5. Există economişti seniori (grad ES) care nu sunt responsabili la niciun contract?
Algebră relaţională
R1 = SELECT (ANGAJAT; Grad=”ES”)
R2 = PROJECT (R1; IDangajat)
R3 = PROJECT (CONTRACT; CodResp)
R4 = DIFFERENCE (R2, R3)
R5 = NATURAL JOIN (R4, ANGAJAT; IDangajat)
R6 = PROJECT (R5; IDangajat, Nume, Grad)
SQL Access
SELECT IDangajat, Nume, Grad
FROM Angajat
WHERE IDangajat NOT IN (SELECT CodResp FROM Contract)
AND Grad="ES";
P6. Care este colectivul (economişti juniori) care lucrează la contractul IDcontract =
333?
SQL Access
SELECT IDcontract, Angajat.IDangajat, Nume, Grad
FROM Angajat, Echipa
WHERE Angajat.IDangajat=Echipa.IDangajat
AND Numar_contract=IDcontract;
10
Numărul contractului (IDcontract) se introduce în mod conversaţional:
Forma raportului:
11
SQL Access
SELECT Contract.IDcontract, DataFin AS Data_finala, Angajat.IDangajat, Nume, Grad
FROM Contract, Angajat, Echipa
WHERE DATE()>DataFin
AND Angajat.IDangajat=Echipa.IDangajat
AND Contract.IDcontract=Echipa.IDcontract
UNION
SELECT Contract.IDcontract, DataFin AS Data_finala, Angajat.IDangajat, Nume, Grad
FROM Contract, Angajat
WHERE DATE()>DataFin
AND IDangajat=CodResp;
12
Obseravţie. Raportul este grupat după IDcontract şi ordonat descrescător dupa Grad,
astfel încât responsabilul să fie pe prima poziţie a colectivului.
P8. Generaţi un raport util managerului firmei SC Conta Consulting SRL din care să
rezulte valoarea centralizată pe responsabili (economişti seniori) a contractelor în
derulare.
Forma raportului:
SQL Access
SELECT Nume AS Nume_responsabil, Valoare_totala
FROM Angajat, [SELECT CodResp, SUM(Val) AS Valoare_totala
FROM contract
WHERE (DATE() BETWEEN DataContr AND DataFin)
GROUP BY CodResp]. AS Tmp1
WHERE IDangajat=CodResp;
13
P9. La ce contracte lucrează împreună economiştii juniori Olteanu O. (IDangajat = 34)
şi Moldoveanu M. (IDangajat = 45) ?
Algebră relaţională
R1 = SELECT (ANGAJAT; IDangajat=”34” OR IDangajat=”45”)
R2 = PROJECT (R1; IDangajat)
R3 = DIVISION (ECHIPA, R2)
R2 IDangajat
34
45
Relaţia R3, obţinută ca rezultat al diviziunii, are un singur atribut (IDcontract) şi trei
tupluri:
R3 IDcontract
111
555
888
SQL Access
SELECT Tmp34.IDcontract
FROM (SELECT IDcontract
FROM Echipa
WHERE IDangajat =34) AS Tmp34,
(SELECT IDcontract
FROM Echipa
WHERE IDangajat =45) AS Tmp45
WHERE Tmp34.IDcontract=Tmp45.IDcontract;
14
Observaţie.
Dacă se doreşte introducerea în mod conversaţional a codurilor pentru responsabili:
SELECT Tmp1.IDcontract
FROM [SELECT IDcontract
FROM Echipa
WHERE IDangajat=Primul_IDangajat]. AS Tmp1,
[SELECT IDcontract
FROM Echipa
WHERE IDangajat=Al_doilea_IDangajat]. AS Tmp2
WHERE Tmp1.IDcontract=Tmp2.IDcontract;
P10. Să se determine angajaţii (economişti juniori) care fac parte concomitent din
colectivele contractelor IDcontract = 555 şi IDcontract = 888.
Algebră relaţională
R1 = SELECT (CONTRACT; IDcontract=”555” OR IDcontract=”888”)
R2 = PROJECT (R1; IDcontract)
R3 = DIVISION (ECHIPA, R2)
R4 = NATURAL JOIN (R3, ANGAJAT; IDangajat)
R5 = PROJECT (R4; Nume)
R2 IDcontract
555
888
15
Relaţia R3, obţinută ca rezultat al diviziunii, are un singur atribut (IDangajat) şi două
tupluri:
R3 IDangajat
34
45
Relaţia R4, obţinută ca rezultat al joncţiunii naturale dintre relaţiile R3 şi Angajat, este:
Nume
Olteanu O.
Moldoveanu M.
SQL Access
SELECT Nume
FROM Angajat
WHERE IDangajat IN
(SELECT Tmp555.IDangajat
FROM (SELECT IDangajat
FROM Echipa
WHERE IDcontract=555) AS Tmp555,
(SELECT IDangajat
FROM Echipa
WHERE IDcontract=888) AS Tmp888
WHERE Tmp555.IDangajat=Tmp888.IDangajat);
16
Dacă se doreşte introducerea în mod conversaţional a codurilor pentru contracte:
SELECT Nume
FROM Angajat
WHERE IDangajat IN
(SELECT Tmp1.IDangajat
FROM (SELECT IDangajat
FROM Echipa
WHERE IDcontract=Primul_IDcontract) AS Tmp1,
(SELECT IDangajat
FROM Echipa
WHERE IDcontract=Al_doilea_IDcontract) AS Tmp2
WHERE Tmp1.IDangajat=Tmp2.IDangajat);
17