Sunteți pe pagina 1din 4

BAZE DE DATE – SEMINAR 10

_____________________________________________________________________

Operatorii algebrei relationale


UNION, INTERSECT, MINUS

Sunt operatori care actioneaza asupra inregistrarilor selectate de 2 sau mai multe
interogari. Sunt similari operatiilor cu multimi.

Atentie: structura (coloanele) celor 2 interogari trebuie sa fie identica!

3.1) Operatorul MINUS – este utilizat pe 2 interogari pentru a extrage din


inregistrarile selectate de prima interogare pe cele selectate de a doua interogare
(A-B).

Exemple:

1) Sa se afiseze angajatii care au salariul intre 4999 si 6500 fara cei care au salariul
5000 si 6000.

SELECT * FROM angajati WHERE salariul BETWEEN 4999 AND 6500


MINUS
SELECT * FROM angajati WHERE salariul IN (5000, 6000);

2) Sa se calculeze diferit discountul (DC) pentru clienti astfel:


 daca clientul a incheiat 1 comanda atunci DC= 10% ;
 daca a incheiat 2 comenzi atunci DC =15%;
 daca a incheiat mai mult de 3 comenzi atunci DC =20%.
Din acestea sa se elimine inregistrarile incheiate de clientii care incep cu litera M.
Ordonati descrescator in functie de numele clientilor.

Observatie: clauza Order by se poate mentiona o singura data la sfarsitul intregii


cereri.

SELECT cl.nume_client, COUNT(co.nr_comanda) numar_comenzi,


(CASE WHEN COUNT(co.nr_comanda)=1 THEN 0.1
WHEN COUNT(co.nr_comanda)=2 THEN 0.15
WHEN COUNT(co.nr_comanda)>=3 THEN 0.2
ELSE 0 END) discount
FROM clienti cl, comenzi co
WHERE cl.id_client=co.id_client
GROUP BY cl.nume_client
MINUS
SELECT cl.nume_client, COUNT(co.nr_comanda) numar_comenzi,
(CASE WHEN COUNT(co.nr_comanda)=1 THEN 0.1
WHEN COUNT(co.nr_comanda)=2 THEN 0.15
WHEN COUNT(co.nr_comanda)>=3 THEN 0.2
ELSE 0 END) discount
FROM clienti cl, comenzi co
WHERE cl.id_client=co.id_client
AND cl.nume_client like 'M%'
GROUP BY cl.nume_client
ORDER BY nume_client;

1
BAZE DE DATE – SEMINAR 10
_____________________________________________________________________

3.2.) Operatorul UNION – este utilizat pe 2 interogari pentru a reuni inregistrarile


selectate de prima interogare cu cele selectate de a doua interogare (A + B).

3) Sa se calculeze distinct comisionul pentru angajati folosind operatorul UNION:


 Daca au 1 comanda comisionul va fi de 10% din valoare totala a
comenzilor;
 Daca au 2 comenzi comisionul va fi de 20% din valoare totala a
comenzilor;
 Daca au 3 comenzi comisionul va fi de 30% din valoare totala a
comenzilor.

SELECT a.nume, COUNT(c.nr_comanda) numar_comenzi,


0.1* SUM(r.cantitate*r.pret) valoare_comision
FROM angajati a, comenzi c, rand_comenzi r
WHERE a.id_angajat=c. id_angajat
AND c.nr_comanda=r.nr_comanda
GROUP BY a.nume
HAVING COUNT(c.nr_comanda)=1
UNION
SELECT a.nume, COUNT(c.nr_comanda) numar_comenzi,
0.2* SUM(r.cantitate*r.pret) valoare_comision
FROM angajati a, comenzi c, rand_comenzi r
WHERE a.id_angajat=c.id_angajat
AND c.nr_comanda=r.nr_comanda
GROUP BY a.nume
HAVING COUNT(c.nr_comanda)=2
UNION
SELECT a.nume, COUNT(c.nr_comanda) numar_comenzi,
0.3* SUM(r.cantitate*r.pret) valoare_comision
FROM angajati a, comenzi c, rand_comenzi r
WHERE a.id_angajat=c.id_angajat
AND c.nr_comanda=r.nr_comanda
GROUP BY a.nume
HAVING COUNT(c.nr_comanda)>=3;

3.3.) Operatorul INTERSECT – este utilizat pe 2 interogari pentru a returna doar


inregistrarile comune selectate de prima interogare si cele selectate de a doua
interogare.

4) Sa se selecteze denumirea produselor, valoare totala comandata


(SUM(cantitate*pret)) si numarul de comenzi (count(nr_comanda)) pentru produsele
comandate de cel putin 3 ori si care au valoarea totala diferita de 1440, 3916.

SELECT p.denumire_produs, SUM(r.cantitate*r.pret) valoare,


COUNT(r.nr_comanda) numar_comenzi
FROM produse p, rand_comenzi r
WHERE r.id_produs=p.id_produs
GROUP BY p.denumire_produs
HAVING COUNT(r.nr_comanda)<=3
INTERSECT

2
BAZE DE DATE – SEMINAR 10
_____________________________________________________________________

SELECT p.denumire_produs, SUM(r.cantitate*r.pret) valoare,


COUNT(r.nr_comanda) nrcomenzi
FROM produse p, rand_comenzi r
WHERE r.id_produs=p.id_produs
GROUP BY p.denumire_produs
HAVING SUM(r.cantitate*r.pret) NOT IN (1440, 3916);

UNION INTERSECT MINUS


select prenume, id_departament
from angajati
where prenume = 'Kevin'
union all select prenume_client, null
from clienti
where prenume_client = 'Kevin'
order by 1;

select id_departament, sum(salariul)


from angajati
group by id_departament
minus/intersect
select id_departament, sum(salariul*(1+nvl(comision,0)))
from angajati
group by id_departament;

select a.id_departament, d.denumire_departament


from angajati a, departamente d
where a.id_departament = d.id_departament
minus
select a.id_departament, d.denumire_departament
from angajati a, departamente d
where a.id_departament = d.id_departament
and salariul >= 10000;

Tema
set 1
1) Sa se afiseze nr_comanda, data, valoarea comenzii, pentru comenzile incheiate in
1999 cu valoarea totala (sum(cantitate*pret)) mai mare de 2000, în ordinea datei.
2) Sa se afiseze numarul comenzii, data, valoarea totala comandata
(sum(cantitate*pret)) si sa se calculeze cheltuielile de transport pentru livrarea
acestora astfel:
- pentru comenzi cu valoarea de pana la 1000 cheltuielile de transport sa fie de
100
- pentru comenzi cu valoarea 1000 si 2000 cheltuielile de transport sa fie de
200
- pentru comenzi cu valoarea mai mare de 2000 cheltuielile de transport sa fie
de 300
3) Sa se afiseze id_client, id_produs si cantitatea totala din fiecare produs, vanduta
unui client.
4) Sa se afiseze numele, denumirea departamentului unde lucreaza si nivelul ierarhic
pentru toti angajatii care au subordonati si care au aceeasi functie ca angajatul Russell.

3
BAZE DE DATE – SEMINAR 10
_____________________________________________________________________

5) Sa se afiseze numele angajatilor care nu au subalterni si care au aceeasi functie ca


angajatul Rogers, nivelul ierarhic si denumirea departamentului unde acestia lucreaza.
6) Sa se afiseze departamentele (id_departament si denumire_departament) care au
numai angajati cu salariul < 10000.
set 2
1) Sa se afiseze numele, salariul, data angajarii, denumirea functiei pentru angajatii
care au functia Programmer sau Accountant si au fost angajati intre 1995 si 1998.
2) Sa se realizeze o operatie de modificare a pretului la produse astfel incat noul pret
sa se mareasca cu 15% pentru toate produsele care au pretul mai mic decat pretul
mediu al produsului care contine denumirea cuvantunl sound (se actualizeaza tabela
rand_comenzi). La final sa se anuleze operatia de actualizare.
3) Sa se afiseze numele, data angajarii, functia actuala si functiile detinute de angajatii
din departamentele 50 si 80 in perioada 1995-1999.
4) Sa se realizeze o operatie de modificare a pretului la produse astfel incat noul pret
sa se micsoreze cu 5% pentru toate produsele care au cantitatea comandata mai mica
decat cantitatea medie comandata din produsul cu denumireacare conţine CPU. (se
actualizeaza tabela rand_comenzi). La final sa se anuleze operatia de actualizare.
5) Sa se afiseze denumirea produselor si valoarea totala comandata a acestora
(sum(cantitate*pret) cuprinsa intre 1500 si 4000.
6) Sa se afiseze numarul comenzii, data, valoarea totala (sum(cantitate*pret)),
numarul de produse pentru comenzile online incheiate in perioada 1999-2000 si
contin cel putin 2 produse.
set 3
1) Sa se afiseze numarul comenzii, denumirea produsului, pretul, cantitatea si
valoarea pentru produsele care contin in denumire cuvantul Monitor.
2) Să se afişeze numele, id-ul departamentului si numărul de comenzi incheiate de
angajatii din departamentul 80 in luna noiembrie.
3) Sa se realizeze actualizarea pretului la produse astfel incat noul pret sa se
micsoreze cu 10% pentru toate produsele care au pretul mai mare decat al pretul
mediu al produsului cu id-ul ‘3155’ (se actualizeaza tabela rand_comenzi). La final
sa se anuleze actualizarea.
4) Sa se afiseze numele, denumirea functiei, numarul de comenzi pentru angajatii
care au incheiat cel putin 2 comenzi.
5) Sa se realizeze actualizarea pretului la produse astfel incat noul pret sa se mareasca
cu 5% pentru toate produsele care au valoarea comandata (cantitate*pret) mai mare
sau egala cu 1000 (se actualizeaza tabela rand_comenzi). La final sa se anuleze
operatia de actualizare.
6) Sa se afiseze numele, numarul de comenzi, salariul si bonusul fiecarui angajat.
Bonusul se va calcula in functie de numarul de comenzi incheiate, astfel:
-- intre 1-2 comenzi – 5% din salariul lunar;
-- intre 3-5 comenzi – 7% din salariul lunar;
-- mai mult de 5 comenzi – 10% din salariul lunar.

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