Sunteți pe pagina 1din 34

Probleme

Curs 6
Test scris (examen)
• Pentru examen trebuie să aveți cont pe Moodle și să vă înscrieți la cursul BD
Postuniversitar
• https://moodle.cs.ubbcluj.ro/course/view.php?id=87

• Vă rog ca cel târziu până miercuri să vă înscrieți pe Moodle la curs. Astfel daca apar
probleme le putem rezolva cel târziu joi.

• În timpul examenului vom fi și în call pe Ms Teams cu camera video pornita unde puteți
pune întrebări dacă e ceva neclar

• Testul scris va avea loc vineri, 25 iunie, ora 17


• Testul scris va dura aprox 2 ore.
• Apoi, de la ora 19 vom ține în continuare curs pe Teams
Quiz Moodle
• La unele întrebări e posibil să aveți nevoie să scrieți soluția pe foaie,
să faceți poză și să încărcați poza.
• Pe Moodle limita pentru un fișier e 1MB
• Pentru fișiere prea mari trebuie să le transformați în fișiere de
dimensiune mai mică. Puteți folosi, de ex.,
https://compressjpeg.com/
• Gasiti un quiz pe Moodle de test unde puteți încerca să încărcați un
fișier.
Restanta
• Vineri, 9 iulie, ora 17.00
Modelare - Magazin
Un magazin vrea să stocheze informații despre următoarele entități:
• Clienți cu informații personale (CNP, nume, prenume, adresa)
• Produse care au o denumire și o descriere.
• Produsele sunt împărțite pe categorii, dar un produs poate să facă
parte din mai multe categorii.
• Magazinul colaborează cu mai mulți distribuitori, pentru că ei pot oferi
prețuri diferite pentru produse.
• Pentru fiecare vânzare către clienți se stochează informațiile facturii.
Modelare - Magazin
• Clienti (idClient, CNP, nume, prenume, idAdresa)
• Adresa(idAdresa, strada, numar, codPostal, localitate, judet)
• Produse(idProdus, numeProdus, descriere, cantitate, pretVanzare)
• Categorii(idCategorie, nume, descriere)
• ProduseCategorii(idProdus, idCategorie)
• Distribuitori(idDistribuitor, numeDistribuitor, telefon, email)
• DistribuitoriProduse(idProdus, idDistribuitor, pretCumparare)
• Facturi(nrFactura, data, idClient)
• FacturaItem (nrFactura, idProdus, Cantitate)
• Afișați toate informațiile despre clienți și ce au cumpărat aceștia.
select *
from Clienti C inner join Facturi F on C.idClient = F.idClient
inner join FacturiItem FI on F.nrFactura = FI.nrFactura
inner join Produse P on P.idProdus = FI.idProdus
• Afișați produsele din categoria A sau B (nume de categorii)
select P.numeProdus
from Produse P inner join ProduseCategorii PC on P.idProdus = PC.idProdus
inner join Categorii C on PC.idCategorie = C.idCategorie
where C.nume = ‘A’ or C.nume = ‘B’

select P.numeProdus
from Produse P inner join ProduseCategorii PC on P.idProdus = PC.idProdus
inner join Categorii C on PC.idCategorie = C.idCategorie
where C.nume in (‘A’, ‘B’)
• Afișați produsele care fac parte atât din categoria A, cât și din categoria B
select P.numeProdus
from Produse P inner join ProduseCategorii PC on P.idProdus = PC.idProdus
inner join Categorii C on PC.idCategorie = C.idCategorie
where C.nume = ‘A’
intersect
select P.numeProdus
from Produse P inner join ProduseCategorii PC on P.idProdus = PC.idProdus
inner join Categorii C on PC.idCategorie = C.idCategorie
where C.nume = ‘B’

where C.nume = ‘A’ and C.nume = ‘B’


• Afișați produsele care fac parte atât din categoria A, cât și din categoria B
select P.numeProdus
from Produse P inner join ProduseCategorii PC on P.idProdus = PC.idProdus
inner join Categorii C on PC.idCategorie = C.idCategorie
where C.nume = ‘A’
and P.idProdus in (select P.idProdus
from Produse P inner join ProduseCategorii PC on P.idProdus = PC.idProdus
inner join Categorii C on PC.idCategorie = C.idCategorie
where C.nume = ‘B’)
• Afișați produsele care se află în categoria A, dar nu se află în B
select P.numeProdus
from Produse P inner join ProduseCategorii PC on P.idProdus = PC.idProdus
inner join Categorii C on PC.idCategorie = C.idCategorie
where C.nume = ‘A’
except
select P.numeProdus
from Produse P inner join ProduseCategorii PC on P.idProdus = PC.idProdus
inner join Categorii C on PC.idCategorie = C.idCategorie
where C.nume = ‘B’
• Afișați clienții care au cumpărat produse din categoria care începe cu litera A

select C.nume, C.prenume


from Clienti C inner join Facturi F on C.idClient = F.idClient
inner join FacturaItem FI on FI.nrFactura = F.nrFactura
inner join Produse P on P.idProdus = FI.idProdus
inner join ProduseCategorii PC on PC.idProdus = P.idProdus
inner join Categorii C2 on C2.idCategorie = PC.idCategorie
where C2.nume like ‘A%’
• Afișați numărul de produse din fiecare categorie
select C.nume, count(*) as nrProduse
from Categorie C inner join ProduseCategorii PC on C.idCategorie =
PC.idCategorie
group by C.idCategorie, C.nume

• Afișați prețul produselor în euro știind că în baza de date e stocat în ron


select pretVanzare / 4.92
from Produse

select pretVanzare * 4.92


from Produse
• Afișați distribuitorii de la care nu s-a comandat nici un produs. – 2 metode
select D.numeDistribuitor
from DistribuitoriProduse DP right join Distribuitori D
on DP.idDistribuitor = D.idDistribuitor
where DP.idProdus is NULL

select D.numeDistribuitor
from Distribuitori D
where D.idDistribuitor NOT IN ( select DP.idDistribuitor
from DistribuitoriProduse DP )
• Afișați numărul de produse distincte cumpărate de fiecare client.
select C.nume, count(distinct FI.idProdus) as nrProduse
from Facturi F inner join FacturaItem FI on F.nrFactura = FI.nrFactura inner
join Clienti C on C.idClient = F.idClient
group by C.idClient, C.nume

• Afișați numărul de produse (bucăți) cumpărate în total de fiecare client.


select C.nume, sum(FI.cantitate) as nrBucatiTotal
from Facturi F inner join FacturaItem FI on F.nrFactura = FI.nrFactura inner
join Clienti C on C.idClient = F.idClient
group by C.idClient, C.nume
Pentru fiecare factura in parte:
select C.nume, sum(FI.cantitate) as nrBucatiPeFactura
from Facturi F inner join FacturaItem FI on F.nrFactura = FI.nrFactura inner join
Clienti C on C.idClient = F.idClient
group by C.idClient, C.nume, F.nrFactura
• Afișați suma totală a fiecărei facturi
select FI.nrFactura, sum(FI.cantitate * P.pretVanzare) as sumaFactura
from FacturaItem FI inner join Produse P on P.idProdus = FI.idProdus
group by FI.nrFactura

• Afișați produsele din categoria A în ordine crescătoare a prețului (prețul cu


care a fost cumpărat de la distribuitor)
• Afișați doar produsele cele mai scumpe
select top 1 with ties P.numeProdus, P.pretVanzare
from Produse P
order by P.pretVanzare desc

idee 2:
where P.pretVanzare = ( select max (pretVanzare) from... )

idee 3:
where P.pretVanzare >= ALL (..)
• Afișați categoriile cu cel puțin 10 produse, ordonate descrescător după
numărul de produse
select C.idCategorie, count(*) as nrProduse
from Categorii C inner join ProduseCategorii PC on C.idCategorie =
PC. idCategorie
group by C.idCategorie
having count(*) >= 10
order by count(*) desc
• Afișați clienții care au cumpărat de cele mai multe ori din magazin (o
cumpărătură are o factură)

select C.idClient, C.nume, count(*) as nrFacturi


from Clienti C inner join Factura F on C.idClient = F.idClient
group by C.idClient, C.nume
having count(*) >= ALL (select count(*)
from Factura F2
group by F2.idClient
)
• Afișați clienții care au cumpărat de mai multe ori din magazin decât unul
din clientii Popa Anamaria (dacă sunt mai mulți)
select C.idClient, C.nume, count(*) as nrFacturi
from Clienti C inner join Factura F on C.idClient = F.idClient
group by C.idClient, C.nume
having count(*) > ANY (
select count(*) as nrFacturi
from Clienti C inner join Factura F on C.idClient = F.idClient
where C.nume = ‘Popa’ and C.prenume = ‘Anamaria’
group by C.idClient, C.nume )
• Afișați produsele care sunt mai scumpe decât toate produsele din
categoria A
Tabelul dat prezintă anomalii. Dați exemplu de diferite tipuri de anomalii.
- insert? Un dentist nou?
- update? Dentist – schimbare nume de familie
- Delete? Stergem un pacient, e posibil sa pierdem datele despre un dentist
Cum ați normaliza tabelul?
Dentisti (staffNo, dentistName)
Pacienti (patientNo,patientName)
Programari(appointmentDateTime, surgeryNo, staffNo, patientNo)
Forme Normale
Prezentari (idArticol, idParticipant, numeParticipant, prenumeParticipant)

• Cine poate fi cheie primară? (idArticol, idParticipant)


• Ce dependențe funcționale identificați?
• idParticipant -> numeParticipant, prenumeParticipant
• În ce formă normală e relația următoare? Pot apărea anomalii în relație?
• 1NF – da
• 2NF – nu
• idArticol,idParticipant -> numeParticipant ?totala?
• 3NF, BCNF - nu
• Cum se poate descompune relația?
• Participanti(idParticipant, numeParticipant, prenumeParticipant)
• Prezentari(idArticol, idParticipant)
Forme Normale
Articole (idArticol, titlu, nrPagini, autori) , unde autori e lista de autori

• Cine poate fi cheie primară? idArticol


• Ce dependențe funcționale identificați?
idArticol -> titlu, nrPagini, autori
• În ce formă normală e relația următoare?
• 1NF – nu, avem lista de autori
• => nu e in 2NF, 3NF, BCNF
• Cum se poate descompune relația?
• Articol(idArticol, titlu, nrPagini)
• ArticolAutori(idArticol, idAutor)
• Autori(idAutor, nume)
Forme Normale
Mai multi producători produc același medicament.
Medicamente (idMedicament, numeMedicament, pret, producator,
producatorAdresa)

• Cine poate fi cheie primară?


• Ce dependențe funcționale identificați?
• În ce formă normală e relația următoare?
• Cum se poate descompune relația?
Forme Normale
Vrem ca un medicament sa aibă un singur producător.
Medicamente (idMedicament, numeMedicament, pret, producator, producatorAdresa)

• Cine poate fi cheie primară? idMedicament


• Ce dependențe funcționale identificați?
• idMedicament -> ...toate - partea din stanga e supercheie
• Producator -> producatorAdresa
• În ce formă normală e relația următoare?
• 1NF – da
• 2NF – da
• 3NF – NU din cauza Producator -> producatorAdresa
• BCNF - NU
• Cum se poate descompune relația?
• Medicamente(idMedicament, numeMedicament, pret, producator)
• Producator (producator, producatorAdresa)
Forme Normale
VizualizariFilme ( idFilm, titluFilm, regizor, spectator, dataVizualizare)

• Cine poate fi cheie primară?


• Ce dependențe funcționale identificați?
• În ce formă normală e relația următoare?
• Cum se poate descompune relația?
Forme Normale
• R(A, B, C, D) cu dependențele funcționale AC → D, A → B
• A, B, C, D – atribute atomare

• Cine poate fi cheie primară? AC (A->B , AC ->B, AC ->D, AC ->BDAC)


• În ce formă normală e relația următoare?
• 2NF – nu AC -> B partiala (A->B)
• Cum se poate descompune relația?
• A->B => R1(A, B), R2 (A, C, D)
Forme Normale
• R(A, B, C, D) cu dependențele funcționale AC → D, D → B

• Cine poate fi cheie primară?


• În ce formă normală e relația următoare?
• Cum se poate descompune relația?
Forme normale
• Dați exemplu de o relație care este în 1NF, dar nu este în 2NF

• Dați exemplu de o relație care este în 2NF, dar nu este în 3NF


Index
• Se da un index de tip B-arbore pe o cheie compusă (a,b). Pentru care
din următoarele condiții poate fi folosit indexul și în ce fel?
a) a > 6 AND b = 5
b) a < 4 AND c < 2
c) b = 2 AND c = 4
d) a < 3 AND b > 9
e) a = 6 OR c = 3
Index
• Se da un index de tip hashtable pe o cheie compusă (a, b). Pentru
care din următoarele condiții poate fi folosit indexul și în ce fel?
a) a > 6 AND b = 5
b) a = 6 OR c = 3
c) a = 6 OR b = 3 – nu pt ca avem or
d) b = 2 AND c = 4
e) a = 3 AND b = 9 - da
f) a = 5
Index
• Ce indecși pot optimiza fiecare din interogările anterioare?

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