Documente Academic
Documente Profesional
Documente Cultură
3.Să se determine codul operelor de artă pentru care s-a încheiat o poliţă de
asigurare sau pentru care s-a achiziţionat un sistem de securitate. Să se afişeze
firma şi data contractării, respectiv a instalării sistemului. Întrucât o operă poate
avea mai multe poliţe de asigurare sau mai multe sisteme de securitate încheiate,
respectiv instalate la aceeaşi firmă şi dată, nu se vor suprima liniile duplicat.
Rezultatul va fi ordonat după codul operelor.
SELECT cod_opera, firma, semnat_contract
FROM polita_asig
UNION ALL
SELECT cod_opera, firma, data_inst
FROM polita_asig
ORDER BY cod_opera;
4.Să se afişeze codurile operelor de artă pentru care a fost încheiată o poliţă de
asigurare sau care beneficiază de un sistem de securitate. Fiecare cod va fi afişat o
singură dată.
SELECT cod_opera
FROM polita_asig
UNION
SELECT cod_opera
FROM securitate
5.Să se afişeze codul operelor de artă, respectiv data la care s-a încheiat o poliţă de
asigurare şi s-a instalat un sistem de securitate.
SELECT cod_opera, semnat_contract
FROM polita_asig
INTERSECT
SELECT cod_opera, data_inst
FROM securitate;
7.Să se determine codul operelor de artă, codul autorilor şi titlul pentru operele a
căror valoare este mai mare decât 5000 sau pentru cele având valoarea de 20 de ori
mai mare decât cea a poliţei de asigurare.
SELECT cod_opera, cod_artist, titlu
FROM opera
WHERE (cod_opera, valoare)
IN (SELECT cod_opera, valoare
FROM opera
WHERE valoare > 5000
UNION
SELECT cod_opera, valoare*20
FROM polita_asig);
11. Să se afişeze artiştii (nume, prenume) şi operele acestora, inclusiv cei care nu
au opere expuse în cadrul muzeului.
SELECT nume, prenume, titlu
FROM opera o
RIGHT OUTER JOIN artist a ON (o.cod_artist = a.cod_artist);
Sau SELECT a.cod_artist, nume, prenume, cod_opera, titlu
FROM artist a, opera o
WHERE a.cod_artist = o.cod_artist (+);
14. Să se afişeze titlul, codul artistului şi valoarea operelor create de artistul căruia
îi aparţine opera având codul 180 şi care se află expuse în aceeaşi galerie cu
operele al căror cod este 100 sau 110. Se presupune că o operă are un singur autor.
SELECT titlu, cod_artist, valoare
FROM opera
WHERE cod_artist = (SELECT cod_artist
FROM opera
WHERE cod_opera = 180)
AND cod_galerie IN (SELECT cod_galerie
FROM opera
WHERE cod_opera IN (100, 110));
15.Să se determine artistul pentru care valoare medie a operelor sale de artă este
minimă.
SELECT cod_artist, AVG(valoare)
FROM opera
GROUP BY cod_artist
HAVING AVG(valoare) = (SELECT MIN(AVG(valoare))
FROM opera
GROUP BY cod_artist);
16. Pentru fiecare artist, să se afişeze titlul şi valoarea celei mai ieftine opere de
artă expuse în muzeu.
SELECT titlu, cod_artist, valoare
FROM opera
WHERE valoare IN (SELECT MIN(valoare)
FROM opera
GROUP BY cod_artist);
17. Să se determine titlul operelor de artă expuse în galeriile având codul 10 sau
30, respectiv numele şi prenumele artiştilor care le-au realizat.
SELECT titlu, nume, prenume
FROM opera NATURAL JOIN artist
WHERE cod_galerie IN (10, 30);
Folosind clauza USING, acest exemplu poate fi rescris astfel:
SELECT titlu, nume, prenume
FROM opera JOIN artist USING (cod_artist)
WHERE cod_galerie IN (10, 30);
18. Să se afişeze operele de artă care nu sunt expuse în galeria având codul 30 şi a
căror valoare este mai mică decât a unei opere din galeria 30.
SELECT cod_opera, titlu, valoare
FROM opera
WHERE valoare < ANY (SELECT valoare
FROM opera
WHERE cod_galerie = 30)
AND cod_galerie <> 30;
Daca operatorul ALL inlocuieste ANY returnează- valoare m. mică decât a
oricărei opere din galeria respectivă.
20.Să se obţină titlurile şi preţurile cărţilor mai scumpe decât cartea având titlul
“Baze de date”, al cărui autor este POPA (self join).
SELECT x.titlu, x.pret
FROM carte x, carte y
WHERE x.pret > y.pret
AND y.titlu = ’Baze de date’
AND y.autor = POPA;
22.Să se afişeze titlurile operelor care sunt expuse în galeriile unde se află lucrările
artistului având codul 60.
a)SELECT titlu
FROM opera
WHERE cod_galerie IN (SELECT cod_galerie
FROM opera
WHERE cod_artist = 60);
**Pentru a evita obţinerea de valori null în rezultatul unei cereri care utilizează
operatorul NOT IN, se poate specifica o condiţie în subcerere:
b)SELECT titlu
FROM opera
WHERE cod_galerie NOT IN (SELECT cod_galerie
FROM opera
WHERE cod_artist = 60
AND cod_galerie IS NOT NULL);
24.Să se determine codul, numele şi prenumele artiştilor care au cel puţin o operă
de artă expusă în muzeu.
a)SELECT cod_artist, nume, prenume
b)SELECT cod_artist, nume, prenume
FROM artist a
FROM artist
WHERE EXISTS (SELECT 'x'
WHERE cod_artist IN (SELECT cod_artist
FROM opera
FROM opera);
WHERE cod_artist = a.cod_artist);
Sau
25. Să se afişeze codul, numele şi prenumele artiştilor care au cel puţin două opere
de artă expuse în muzeu.
SELECT cod_artist, nume, prenume
FROM artist a
WHERE 2 <= (SELECT COUNT(*)
FROM opera
WHERE cod_artist = a.cod_artist);
27.Să se scrie o cerere care afişează numele artiştilor şi valoarea totală a operelor
acestora. Se vor considera artiştii a căror valoare totală a operelor este mai mare
decât media valorilor totale ale operelor tuturor artiştilor.
WITH
val_artist AS (SELECT nume, SUM(valoare) AS total
FROM opera o, artist a
WHERE o.cod_artist = a.cod_artist
GROUP BY nume),
val_medie AS (SELECT SUM(total)/COUNT(*) AS medie
FROM val_artist)
SELECT *
FROM val_artist
WHERE total > (SELECT medie
FROM val_medie)
ORDER BY nume;
28.Să se afişeze codurile de galerii mai mici decât 50, iar pentru fiecare dintre
acestea şi pentru fiecare autor care are opere expuse în galerie, să se listeze
valoarea totală a lucrărilor sale. De asemenea, se cere valoarea totală a operelor
expuse în fiecare galerie. Rezultatul va conţine şi valoarea totală a operelor din
galeriile având codul mai mic decât 50, indiferent de codul autorului.
SELECT cod_galerie, cod_artist, SUM(valoare)
FROM opera
WHERE cod_galerie < 50
GROUP BY ROLLUP(cod_galerie, cod_artist);
29.Să se afişeze valoarea totală a operelor de artă ale unui autor, expuse în cadrul
fiecărei galerii având codul mai mic decât 50. De asemenea, să se afişeze valoarea
totală a operelor din fiecare galerie având codul mai mic decât 50, valoarea totală a
operelor fiecărui autor indiferent de galerie şi valoarea totală a operelor din
galeriile având codul mai mic decât 50.
30.Considerând galeriile al căror cod este mai mic decât 50, să se calculeze media
valorilor operelor:
-pentru fiecare galerie şi, în cadrul acesteia, pentru fiecare artist;
-pentru fiecare artist şi, în cadrul acestuia, pentru anii de achiziţie corespunzători.
GROUP BY cod_artist, TO_CHAR a)SELECT cod_galerie, cod_artist,
TO_CHAR(data_achizitiei, 'yyyy') "an achizitie",
AVG(valoare) "Valoare medie"
FROM opera
WHERE cod_galerie < 50
GROUP BY GROUPING SETS
((cod_galerie, cod_artist),
(cod_artist, TO_CHAR(data_achizitiei, 'yyyy')));
Sau: b) SELECT cod_galerie, cod_artist, NULL "an achizitie",
AVG(valoare) "Valoare medie"
FROM opera
GROUP BY cod_galerie, cod_artist
UNION ALL
SELECT NULL, cod_artist,
TO_CHAR(data_achizitiei, 'yyyy'), AVG(valoare)
FROM opera ………………
(data_achizitiei, 'yyyy');
40.Să se obţină job-ul pentru care salariul mediu este minim. Sa se afiseze si
salariul mediu. SELECT job, AVG(sal)
FROM angajati
GROUP BY job
HAVING AVG(sal)=(SELECT MIN(AVG(sal))
FROM angajati
GROUP BY job);
41. Să se obţină salariaţii al căror salariu este mai mare ca salariile medii din toate
departamentele.
SELECT nume, job
FROM angajati
WHERE sal > ALL(SELECT AVG(sal)
FROM angajati
GROUP BY cod_dep);
44.Să se obţină numele primilor trei salariaţi având retribuţia maximă (ideea
rezolvării este de a verifica dacă numărul salariaţilor care au leafa mai mare decât
leafa salariatului considerat, este mai mic decât 3).
SELECT ename
FROM emp a
WHERE 3>(SELECT COUNT(*)
FROM emp
WHERE sal > a.sal);
45.Să se obţină, folosind operatorul INTERSECT, angajaţii care au salariul < 3000
şi al căror nume conţine litera a pe poziţia 3.
SELECT employee_id, last_name
FROM employees
WHERE salary<3000
INTERSECT
SELECT employee_id, last_name
FROM employees
WHERE UPPER(last_name) LIKE '__A%';
46.Să se creeze o cerere prin care să se afişeze numărul total de angajaţi şi, din
acest total, numărul celor care au fost angajaţi în 1997.
SELECT COUNT(*)|| ' nr_total ' numar
FROM employees
UNION
SELECT COUNT(*)|| ' nr_1980 ' numar_1997
FROM employees
WHERE TO_CHAR(hire_date,'YYYY')=1997;
54.Există în tabelul FILM filme pentru care preţul pentru DVD este egal cu preţul
pentru VHS?
SELECT taxa_inchiriat AS TAXA
FROM FILM_INCHIRIAT
WHERE taxa_inchiriat IS NOT NULL
INTERSECT
SELECT taxa_intarziere AS TAXA
FROM FILM_INCHIRIAT
WHERE taxa_intarziere IS NOT NULL;
59.Să se obţină informaţii despre cărţile al căror preţ depăşeşte media preţurilor
cărţilor ce aparţin aceluiaşi domeniu
SELECT *
FROM carte c
WHERE pret > (SELECT AVG(pret)
FROM carte
WHERE coded = c.coded);
64.Să se obţină numele cititorilor care au împrumutat cel puţin o carte scrisă de
ZOLA.
SELECT nume
FROM cititor
WHERE codec IN
(SELECT DISTINCT codec
FROM imprumuta
WHERE codel IN
(SELECT codel
FROM carte
WHERE autor=‟ZOLA‟));
72.Să se obţină lista codurilor cărţilor împrumutate şi codul primului cititor care a
împrumutat aceste cărti.
SELECT codel,codec
FROM imprumuta i
WHERE dataim<=ALL (SELECT dataim
FROM imprumuta
WHERE i.codel=codel);
73.Să se obţină codurile cărţilor din care cel puţin un exemplar este împrumutat.
SELECT codel
FROM carte
WHERE EXISTS
(SELECT codel
FROM imprumuta
WHERE codel = carte.codel
AND dataef IS NULL);
77.Să se obţină numele cititorilor care au împrumutat cel puţin aceleaşi cărţi ca şi
cititorul având codul C19 (ideea problemei este de a selecta cititorii pentru care
este vidă lista cărţilor împrumutatede C19 mai puţin lista cărţilor împrumutate de
acei cititori). SELECT nume
FROM cititor
WHERE NOT EXISTS
(SELECT codel
FROM imprumuta
WHERE codec=‟C19‟
MINUS
SELECT codel
FROM imprumuta
WHERE codec= cititor.codec);
80.Să se obţină numele cititorilor care au împrumutat cel puţin două cărţi.
a)Soluţia 1 (forma relaţională):
SELECT nume
FROM cititor, imprumuta
WHERE cititor.codec=imprumuta.codec
GROUP BY nume
HAVING COUNT(*)>1;
b)Soluţia 2 (forma procedurală):
SELECT nume
FROM cititor
WHERE codec IN
(SELECT codec
FROM imprumuta
GROUP BY codec
HAVING COUNT(*)>1);
81.Să se obţină, utilizând operatorul INTERSECT, codurile cărţilor din care sunt
mai puţin de 15 exemplare şi care au fost împrumutate de cel puţin trei ori.
SELECT codel
FROM carte
WHERE nrex < 15
INTERSECT
SELECT codel
FROM imprumuta
GROUP BY codel
HAVING COUNT(*) > 3;