Sunteți pe pagina 1din 17

BAZE DE DATE

Seminar 12
Evaluare individuala – 2 p

LUCRU INDIVIDUAL

 Meta Instrucțiuni:
1. Folosind adresa de e-mail instituțională (de student), rezultatele obținute vor fi transmise pe e-
mail la următoare adresă: roxana.adam@unibuc.ro sau folosind adresa
faa.ub.lucrari@gmail.com pentru cei care nu acces la adresa de e-mail instituțională.
2. Rezultatele obținute vor fi transmise în dublu exemplar sub forma unui fișier text cu extensia
.txt şi a unui fişier cu extensia .sql, numele fișierului având următorul format:
CE_II_T2_<grupa1/2/3>_<nume>_<prenume>. txt / .sql (exemplu:
CE_II_T2_grupa1_Popescu_IonAlexandru.txt şi CE_II_T2_grupa1_Popescu_IonAlexandru.sql),
care să conțină toate instrucțiunile utilizate pentru rezolvarea cerințelor (DOAR fisierul .txt
trebuie sa conțină si outputul), împreună cu comentarii sub forma acceptată de MySQL (ex: /*
comentariu */, - , #, \! echo).
3. Vor fi punctate doar rezolvările care nu au erori şi afişează rezultatul corect. Fișierul cu extensia
.sql trebuie sa fie executabil în MySQL, iar cel cu extensia .txt să redea exact aceeaşi structura
ca primul fişier + outputul aferent fiecărei interogări.
4. Fișierul se completează în ordine cronologică a cerințelor: începând cu prima cerință şi se
încheie cu ultima cerinţă. Cerințele care nu au rezolvare vor fi completate cu mesajul:
/* cerinţă nerezolvată */
5. Mailul va avea drept subiect/titlu “ CE_II_T2_<grupa1/2/3>_<nume>_<prenume>” (exemplu:
CE_II_T2_grupa1_Popescu_IonAlexandru)
6. Termen limită de primire a fișierului de lucru este: 12.01.2023 ora 18:00. Tot ce depășește
această dată nu va fi luat în considerare.
7. Pentru orice nelămurire legată de lucru individual, în se realizează o listă cu toate întrebările
studenților și se trimit de un reprezentant al studenților pe e-mail coordonatorului de seminar
până la data 10.01.2023 ora 18:00.
8.
 Punctaj:
Pentru a fi punctată lucrarea trebuie să respectare meta instrucțiunile.
Punctaj: 2 p (20% din nota finală).
Fiecare întrebare are notat punctajul aferent.

 ONESTITATE ACADEMICĂ

Însușirea ideilor altor autori pentru rezolvarea prezentei teme, fie prin preluarea parțială sau
totală, fără a menționa prin referință completă şi corectă sursa acestor idei sugerează în mod
eronat cititorului faptul că acele idei v-ar aparține.
Atenţie! În conformitate cu Carta Universităţii din Bucureşti, cazurile de plagiat pot duce la
exmatricularea fără drept de apel a studentului aflat în această situaţie.

ALTE FORME DE ONESTITATE ACADEMICĂ


Nu sunt acceptabile şi pot fi sever sancţionate:
 prezentarea aceleiaşi lucrări pentru mai multe cursuri;
 copierea de la colegi a lucrărilor sau a unor părţi a unor lucrări, inclusiv în timpul examenelor;
 orice alte forme de înşelătorie pentru obţinerea unor rezultate sau avantaje şcolare
necuvenite.
 Cerinţele temei 2, de lucru individual, se află în fişierul:
template_CE_II_T2_grupaX_nume_prenume_CERINTE.txt

REZOLVARE:

CREATE DATABASE tema2;


USE tema2;
SOURCE C:/bazedate_sql/Tema2_Script.sql; /* ATENTIE! Incarcati baza de date ’Tema2_Script’ din
fisierul in care ati salvat-o */
SHOW TABLES;

/* O data incarcata baza de date in MySQL (command line client) puteti vizualiza Diagrama entitate-
relatie (ERD) cu ajutorul MySQL Workbench in format editabil pentru intelegerea bazei de date*/

/* Instructiuni privind intelegerea constructiei fiecarui tabel */


# DESCRIBE nume_tabel;
# SHOW CREATE TABLE nume_tabel\G
# SELECT * FROM nume_tabel LIMIT 10;

/* Q1: Pe baza Diagramei entitate-asociere (ERD) din documentul PDF sau vizualizata cu ajutorul MySQL
Workbench dupa incarcarea baze de date, descrieti tipurile de asocieri aferente tabelului:
a. customer,
b. employee,
c. account.
Pentru clarificari suplimentare, la nevoie, folositi instructiunea: SHOW CREATE TABLE nume_tabel\G.
Prezentati cu cate alte tabele se afla in asociere tabelul de interes, variabila de legatura, apoi detaliati
optionalitatea si cardinalitatea asocieriilor cu fiecare tabel. */
#1p

a. Tabelul "Customer" se afla in relatie cu 4 tabele:


Account: Relatie Many-to-one, optionala, avand variabila de legatura "CUST_ID";
Business: Relatie Many-to-one, obligatorie, avand variabila de legatura "CUST_ID";
Officer: Relatie Many-to-one, optionala, avand variabila de legatura "CUST_ID";
Individual: Relatie Many-to-one, obligatorie, avand variabila de legatura "CUST_ID";

b. Tabelul "Employee" se afla in relatie cu 5 tabele:


Employee: Relatie Many-to-one, optionala, avand variabila de legatura "SUPERIOR_EMP_ID";
Acc_Transaction: Relatie Many-to-one, optionala, avand variabila de legatura "TELLER_EMP_ID";
Department: Relatie Many-to-one, optionala, avand variabila de legatura "DEPT_ID";
Account: Relatie Many-to-one, optionala, avand variabila de legatura "OPEN_EMP_ID";
Branch: Relatie Many-to-one, optionala, avand variabila de legatura "ASSIGNED_BRANCH_ID";

c. Tabelul "Account" se afla in relatie cu 5 tabele:


Product: Relatie Many-to-one, optionala, avand variabila de legatura "PRODUCT_CD";
Employee: Relatie Many-to-one, optionala, avand variabila de legatura "OPEN_EMP_ID";
Acc_Transaction: Relatie Many-to-one, optionala, avand variabila de legatura "ACCOUNT_ID";
Branch: Relatie Many-to-one, optionala, avand variabila de legatura "OPEN_BRANCH_ID";
Customer: Relatie Many-to-one, optionala, avand variabila de legatura "CUST_ID";
/* Q2:
a. Utilizand comanda SQL corespunzatoare, afisati Product_Cd, Name si Product_Type_Cd din tabelul
Product.
b. Utilizand comanda SQL corespunzatoare, afisati valorile distincte (diferite) din coloana
Product_Type_Cd din tabelul Product. */
#1p

Select Pro.Product_Cd
,Pro.Name
,Pro.Product_Type_Cd
From Product Pro;

Select Distinct Pro.Product_Type_Cd


from Product Pro;

/* Q3: Utilizand comanda SQL corespunzatoare, afisati datele de identificare a angajatilor (Emp_Id,
First_Name. Last_Name, Dept_Id) a caror prenume (First_Name) incepe cu litera C sau T si lucreaza in
departamentul 1 sau 2 (Dept_Id). */
#1p
Select Emp.Emp_Id
,Emp.First_Name
,Emp.Last_Name
,Emp.Dept_Id
From Employee Emp
Where (Emp.First_Name Like 'C%' Or Emp.First_Name Like 'T%')
And Emp.Dept_Id IN (1, 2);

/* Q4: Utilizand comanda SQL corespunzatoare, afisati urmatoarele date despre angajati cu ID-ul
(Emp_Id) cuprins intre 5 si 10: Emp_Id, First_Name. Last_Name, Start_Date din tabelul Employee si
numele departamentului in care lucreaza fiecare angajat (coloana Name din tabelul Department). */
#1p

Select Emp.Emp_Id
,Emp.First_Name
,Emp.Last_Name
,Emp.Start_Date
,Dep.Name
From Employee Emp, Department Dep
Where Emp.DEPT_ID = Dep.DEPT_ID AND
(Emp.Emp_Id Between 4 And 7);
/* Q5: Utilizand comanda SQL corespunzatoare, afisati datele de identificare a ofiterilor de serviciu
(Officer_Id, Last_Name, First_Name, Start_Date) din tabelul Officer si a clientilor cu care au colaborat
(Cust_ID, Cust_TYPE_CD) din tabelul Customer. Ordonati datele dupa numele de familie (Last_Name) a
ofiterilor in ordine crescatoare si prenumele (First_Name) acestora in ordine descrescatoare. */
#1p

Select Off.Officer_Id
, Off.Last_Name
, Off.First_Name
, Off.Start_Date
, Cust.Cust_ID
, Cust. Cust_TYPE_CD
From Officer Off, Customer Cust
Where Off.Cust_ID = Cust.Cust_ID
Order By Off. Last_Name ASC, Off.First_Name desc;
/* Q6: Utilizand comanda SQL corespunzatoare, pentru fiecare tip de servicii (Product_Cd)de care
beneficieaza mai mult de trei 3 participanti, listati balanta conturilor (Avail_Balance) ca suma medie si
suma totala de bani in conturi.
#1p

Select Acc.Product_Cd
,Count(Acc.Product_Cd) As Count_Acc
,Sum(Acc.Avail_Balance) As Sum_Avail_Balance
,Avg(Acc.Avail_Balance) As Avg_Avail_Balance
From Account Acc
Group By Acc.Product_Cd
Having Count(*) > 3;

/* Q7: Un client poate detine unul sau mai multe conturi. Conturile pot fi deschise la diferite sucursale
(Open_Branch_Id). Utilizand comanda SQL corespunzatoare, afisati: suma minima disponibila
(Avail_Balance) din conturi pentru fiecare sucursala, id-ul condului (Account_ID) si sucursala aferenta. */
#1p

Select Acc.Open_Branch_Id
,Acc.Account_ID
,Min(Acc.Avail_Balance)
From Account Acc
Group By Acc.Open_Branch_Id;
/* Q8: Scrieti o instructiune SQL de tip JOIN pentru a afisa id-ul angajatului, numele, prenumele, id-ul
departamentului, numele departamentului (Emp_Id, First_Name, Last_Name, Dept_Id, Name) pentru
observatiile comune din tabelele Employee si Department. */
#1p

Select Emp.Emp_Id
,Emp.First_Name
,Emp.Last_Name
,Emp.Dept_Id
,Dep.Name Dept_Name
From Employee Emp
Inner Join Department Dep
On Emp.Dept_Id = Dep.Dept_Id
Order By Emp.Emp_Id;
/* Q9: Scrieti o instructiune SQL de tip LEFT JOIN pentru a afisa pentru urmatoarele date din tabelul
Customer (Cust_Id, Fed_Id, State) informatii din tabelul Officer (Cust_Id, Officer_Id, Start_Date, Title).
Utilizati tabelele Customer si Officer. */
#1p

Select Cus.Cust_Id
,Cus.Fed_Id
,Cus.State
,Ofc.Cust_Id As Ofc_Cust_Id
,Ofc.Officer_Id
,Ofc.Start_Date
,Ofc.Title
From Customer Cus -- Table1
Left Join Officer Ofc -- Table2
On Cus.Cust_Id = Ofc.Cust_Id;
/* Q10: Scrieti o instructiune SQL de tip RIGH JOIN pentru a afisa pentru urmatoarele date din tabelul
Customer (Cust_Id, Fed_Id, State) informatii din tabelul Officer (Cust_Id, Officer_Id, Start_Date, Title).
Utilizati tabelele Customer si Officer. */
#1p

Select Cus.Cust_Id
,Cus.Fed_Id
,Cus.State
,Ofc.Cust_Id As Ofc_Cust_Id
,Ofc.Officer_Id
,Ofc.Start_Date
,Ofc.Title
From Officer Ofc -- Table1
Right Join Customer Cus -- Table2
On Ofc.Cust_Id = Cus.Cust_Id;
/* Q11: Scrieti o instructiune SQL de tip LEFT JOIN pentru a afisa pentru urmatoarele date din tabelul
Officer (Cust_Id, Officer_Id, Start_Date, Title) informatii din tabelul Customer (Cust_Id, Fed_Id, State).
Utilizati tabelele Customer si Officer. */
#1p

Select Cus.Cust_Id
,Cus.Fed_Id
,Cus.State
,Ofc.Cust_Id As Ofc_Cust_Id
,Ofc.Officer_Id
,Ofc.Start_Date
,Ofc.Title
From Officer Ofc
Left Join Customer Cus
On Ofc.Cust_Id = Cus.Cust_Id;
/* Q12: Care este clasamentul oraselor bogate din punct de vedere al sumelor economisite (in ordine
descrescatoare) de clientii cu CUST_TYPE_CD='I'?
Creati o interograre utilizand RIGHT JOIN pentru a afisa pentru fiecare oras totalul sumei disponibile in
cont (folosind variabilele CITY si AVAIL_BALANCE din tabelele account si customer) pentru clientii cu
CUST_TYPE_CD='I'.
Indiciu (SUM(AVAIL_BALANCE)).*/
#1p

SELECT c.CITY, SUM(AVAIL_BALANCE) as TOTAL


from account a
RIGHT JOIN (SELECT CUST_ID, CITY FROM customer WHERE CUST_TYPE_CD='I') c
ON a.CUST_ID=c.CUST_ID
GROUP BY c.CITY
ORDER BY TOTAL DESC;
/* Q13: Care este clasamentul oraselor bogate din punct de vedere al sumelor economisite (in ordine
descrescatoare) de clientii cu CUST_TYPE_CD='I'?
De aceasta data creati o subinterograre utilizand clauza WHERE (fara a folosi JOIN) pentru a afisa pentru
fiecare oras totalul sumei disponibile in cont (folosind variabilele CITY si AVAIL_BALANCE din tabelele
account si customer) pentru clientii cu CUST_TYPE_CD='B'.
Indiciu (SUM(AVAIL_BALANCE)).*/
#2p

SELECT c.CITY, SUM(a.TOTAL) as TOTAL


FROM customer c,
(SELECT CUST_ID, SUM(AVAIL_BALANCE) AS TOTAL FROM account GROUP BY CUST_ID) a
WHERE c.CUST_ID=a.CUST_ID AND CUST_TYPE_CD='B'
GROUP BY CITY
ORDER BY TOTAL DESC;
/* Q14: Care este firma (colona NAME din tabelul business) si in ce oras (colona CITY din tabelul
customer) activeaza care detine cele mai multe lichiditati (colona AVAIL_BALANCE din tabelul account)
pentru clientii cu CUST_TYPE_CD='B'?
Creati interograrea utilizand LEFT JOIN.
Indiciu MAX(AVAIL_BALANCE) */
#1p

SELECT Name, City, MAX(Avail_Balance)


FROM Business b
LEFT JOIN Customer c ON b.Cust_Id = c.Cust_Id
LEFT JOIN Account a ON c.Cust_Id = a.Cust_Id
WHERE Cust_Type_Cd = 'B'
GROUP BY City
ORDER BY MAX(Avail_Balance) DESC
LIMIT 1;

/* Q15: Care este firma (colona NAME din tabelul business) si in ce oras (colona CITY din tabelul
customer) activeaza care detine cele mai multe lichiditati (colona AVAIL_BALANCE din tabelul account)
pentru clientii cu CUST_TYPE_CD='B'?
De aceasta data creati o subinterograre utilizand clauza WHERE (fara a folosi JOIN).
Indiciu MAX(AVAIL_BALANCE) */
#2p

SELECT Name, City, MAX(Avail_Balance)


FROM Customer c, Business b, Account a
WHERE Cust_Type_Cd = 'B'
AND b.Cust_Id IN (SELECT Cust_Id FROM Business
WHERE b.Cust_Id = c.Cust_Id )
AND c.Cust_Id IN (SELECT Cust_Id FROM Customer
WHERE c.Cust_Id = a.Cust_Id )
GROUP BY City
ORDER BY MAX(Avail_Balance) DESC
LIMIT 1;

/* Q16: Afisati numele produselor care au facut obiectul unei operatiuni de cont si id-ul conturilor
respective (coloana NAME din tabelul product si coloana ACCOUNT_ID din tabelul account).
Creati interograrea utilizand INNER JOIN. */
#1p

SELECT p.NAME, a.ACCOUNT_ID


FROM product p
INNER JOIN (SELECT ACCOUNT_ID, PRODUCT_CD FROM account) a
ON p.PRODUCT_CD=a.PRODUCT_CD;
/* Q17: Afisati numele produselor care au facut obiectul unei operatiuni de cont si id-ul conturilor
respective (coloana NAME din tabelul product si coloana ACCOUNT_ID din tabelul account).
De aceasta data creati o subinterograre utilizand clauza WHERE (fara a folosi JOIN). */
#1p

SELECT NAME, a.ACCOUNT_ID


FROM product as p, (SELECT PRODUCT_CD, ACCOUNT_ID from account) as a
WHERE p.PRODUCT_CD=a.PRODUCT_CD;
/* Q18: Calculati pentru soldul bancar din conturi (AVAIL_BALANCE) valoarea maxima, minima si medie
pentru conturile bancare de tip imprumut ‘PRODUCT_TYPE_CD='LOAN'’. */
#1p

SELECT PRODUCT_TYPE_CD, MAX(AVAIL_BALANCE), MIN(AVAIL_BALANCE),


AVG(AVAIL_BALANCE)
FROM (account a NATURAL JOIN product p)
WHERE PRODUCT_TYPE_CD='LOAN';

# verificam
SELECT PRODUCT_TYPE_CD, AVAIL_BALANCE
FROM (account a NATURAL JOIN product p)
WHERE PRODUCT_TYPE_CD='LOAN';

S-ar putea să vă placă și