Sunteți pe pagina 1din 21

1.

Să se afişeze titlurile operelor de artă, firmele la care sunt asigurate şi descrierea


poliţelor de asigurare corespunzătoare.
SELECT o.titlu, p.firma, p.descriere
FROM opera o JOIN polita_asig p ON
(o.cod_opera = p.cod_opera);

2. Să se afişeze titlurile operelor de artă şi firmele la care acestea sunt asigurate. Se


vor lua în considerare şi operele de artă pentru care nu au fost încheiate poliţe de
asigurare.
SELECT titlu, firma
FROM opera o
LEFT OUTER JOIN polita_asig p ON (o.cod_opera = p.cod_opera);

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;

6.Să se determine codul şi valoarea operelor de artă al căror preţ nu este de 20 de


ori mai mare decât valoarea poliţei de asigurare.
SELECT cod_opera, valoare
FROM opera
MINUS
SELECT cod_opera, valoare*20
FROM polita_asig;

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);

8.Să se listeze codul operelor de artă, codul şi numele artiştilor.


SELECT cod_opera, cod_artist, TO_CHAR(null) nume
FROM opera
UNION
SELECT TO_NUMBER(null), cod_artist, nume
FROM artist;

9. Să se afişeze informaţii despre operele de artă achiziţionate în 2008 şi galeriile


în care au fost expuse.
SELECT cod_opera, titlu, o.cod_galerie, nume_galerie, adresa
FROM opera o, galerie g
WHERE o.cod_galerie = g.cod_galerie
AND TO_CHAR(data_achizitiei, 'yyyy') = '2008';
10. Să se afişeze informaţii referitoare la operele de artă, artiştii care le-au creat şi
galeriile în care sunt expuse.
SELECT cod_opera, titlu, data_crearii,
a.cod_artist, nume, prenume,
g.cod_galerie, nume_galerie, adresa
FROM opera o, galerie g, artist a
WHERE o.cod_artist = a.cod_artist
AND o.cod_galerie = g.cod_galerie;

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 (+);

12. Să se afişeze numele şi prenumele artiştilor, precum şi titlurile operelor create


de aceştia. Se vor afişa şi artiştii care nu au opere expuse în cadrul muzeului,
precum şi titlurile operelor al căror autor este necunoscut.
SELECT nume, prenume, titlu
FROM opera o
FULL OUTER JOIN artist a ON (o.cod_artist = a.cod_artist);

13.Să se obţină titlurile cărţilor şi numele domeniului căruia îi aparţin, remarcând


si situaţiile în care domeniul nu ar avea cărţi (dacă domeniul este fără cărţi atunci
apare null la titlul cărţii).
SELECT titlu, intdom
FROM carte, domeniu
WHERE carte.coded(+) = domeniu.coded;

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ă.

19. Să se afişeze cele mai scumpe 3 opere de artă din muzeu.


SELECT ROWNUM "Nr.Crt", titlu, valoare
FROM (SELECT titlu, valoare
FROM opera
ORDER BY valoare DESC)
WHERE ROWNUM <= 3;

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;

21.Din punct de vedere logic, următoarea cerere ar trebui să returneze titlurile


operelor care nu sunt expuse în galeriile unde se află lucrările artistului având
codul 60.
SELECT titlu
FROM opera
WHERE cod_galerie NOT IN (SELECT cod_galerie
FROM opera
WHERE cod_artist = 60);

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);

23.Să se afişeze informaţii despre operele de artă a căror valoare depăşeşte


valoarea medie a celor expuse în aceeaşi galerie.
SELECT titlu, valoare, cod_galerie
FROM opera o
WHERE valoare > (SELECT AVG(valoare)
FROM opera
WHERE cod_galerie = o.cod_galerie);

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);

26.Să se determine operele care nu sunt menţionate în nici o sursă bibliografică.


a)SELECT cod_opera, titlu
FROM opera o
WHERE NOT EXISTS (SELECT 'x'
FROM mentionata_in
WHERE cod_opera = o.cod_opera);
***Acest exemplu poate fi rezolvat şi printr-o subcerere necorelată, utilizând
operatorul NOT IN:
b)SELECT cod_opera, titlu
FROM opera
WHERE cod_opera NOT IN (SELECT cod_opera
FROM ment_in
WHERE cod_opera IS NOT NULL);

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.

a)SELECT cod_galerie, cod_artist, SUM(valoare)


FROM opera
WHERE cod_galerie < 50
GROUP BY CUBE(cod_galerie, cod_artist);
***Folosind functia GROUPING:

b)SELECT cod_galerie, cod_artist, SUM(valoare),


GROUPING(cod_galerie), GROUPING(cod_artist)
FROM opera
WHERE cod_galerie < 50
GROUP BY ROLLUP(cod_galerie, cod_artist);

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');

31.Să se determine media valorilor operelor luând în considerare următoarele


grupări: (cod_galerie, cod_artist, an_achizitie), (cod_galerie, cod_artist),
(cod_galerie, an_achizitie), (cod_galerie).
SELECT cod_galerie, cod_artist,
TO_CHAR(data_achizitiei, 'yyyy') an_achizitie,
AVG(valoare)
FROM opera
GROUP BY cod_galerie, ROLLUP(cod_artist),
CUBE(TO_CHAR(data_achizitiei, 'yyyy'));

32.Lista tuturor salariaţilor si informatii despre departamentele in care lucreaza,


inclusiv a celor care nu sunt asignaţi nici unui departament (right outher join).
SELECT a.deptno, a.dname, b.empno, b.deptno
FROM dept a, emp b
WHERE a.deptno(+) = b.deptno;

33.Să se afişeze codurile departamentelor care nu au angajaţi, implementând


operatorul MINUS.
SELECT department_id
FROM departments
MINUS
SELECT DISTINCT department_id
FROM employees;

34.Lista departamentelor, inclusiv a celor care nu au salariaţi (left outer join).


SELECT a deptno, a.dname, b.empno, b.deptno
FROM dept a, emp b
WHERE a.deptno = b.deptno(+);

35.Departamentele, chiar şi cele fără funcţionari, şi funcţionarii, chiar şi cei care nu


sunt asignaţi nici unui departament (full outer join).
SELECT NVL(TO_CHAR(b.empno),’***’) id,
NVL(a.dname,’***’) nume_dep
FROM dept a, emp b
WHERE a.deptno = b.deptno(+)
UNION
SELECT NVL(TO_CHAR(b.empno),’***’) id,
NVL(a.dname,’***’) nume_dep
FROM dept a, emp b
WHERE a.deptno(+) = b.deptno;

36.Să se obţină pentru fiecare salariat numele, salariul şi grila de salarizare (Θ


join).
SELECT e.name, e.sal, s.grade
FROM emp e, salgrade s
WHERE e.sal BETWEEN s.lasal AND s.hisal;

37.Să se obţină numele salariaţilor, salariile, codul departamentului în care


lucrează şi salariul mediu pe departament pentru toţi angajaţii care au salariul mai
mare ca media salariilor din departamentul în care lucrează (folosirea subcererii în
clauza FROM).
SELECT a.nume, a.sal, a.cod_dep, b.salavg
FROM angajati a, (SELECT dept ,avg(sal) salavg
FROM angajati
GROUP BY cod_dep) b
WHERE a. cod_dep =b. cod_dep
AND a.sal>b.salavg

38.Utilizând operatorul UNION, să se listeze codul salariaţilor, codul şi numele


departamentelor.
SELECT employee_id, department_id, TO_CHAR(NULL) nume
FROM employees
UNION
SELECT TO_NUMBER(NULL), department_id, department_name
FROM departments;

39.Să se obţină numele şi salariul angajaţilor, având salariul minim.


SELECT name, sal
FROM angajati
WHERE sal=(SELECT MIN(sal)
FROM angajati);

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);

42.Să se obţină salariaţii care nu au subordonaţi.


SELECT a.nume
FROM angajati a
WHERE a.cod_ang NOT IN (SELECT m.mgr
FROM angajati m);

43.Să se obţină lista salariaţilor având salariul minim în departamentul în care


lucrează.
SELECT ename,sal
FROM emp e
WHERE sal=(SELECT MIN(sal)
FROM emp
WHERE deptno=e.deptno);

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;

47.Să se afişeze numele, prenumele, salariul lucrătorilor, codurile publicaţiilor la


care lucrează şi salariul mediu pe publicaţie pentru toţi angajaţii care au salariul
mai mare decât media salariului pe publicaţia respectivă.
SELECT s.nume, s.prenume, s.salariu,
p.nr_publicatie, a.salariu_mediu
FROM salariat s, publicatie p,
(SELECT p1.nr_publicatie,AVG(salariu) salariu_mediu
FROM publicatie p1, salariat s1
WHERE p1.cod_salariat = s1.cod_salariat
GROUP BY p1.nr_publicatie) a
WHERE p.nr_publicatie = a.nr_publicatie
AND s.cod_salariat = p.cod_salariat
AND s.salariu > a.salariu_mediu;

48.Să se obţină numele salariaţilor care nu cunosc nici o limbă străină.


SELECT nume, prenume
FROM salariat
WHERE NOT EXISTS
(SELECT *
FROM limba
WHERE limba.cod_salariat = salariat.cod_salariat
AND limba_cun IS NOT NULL);

49.Să se afişeze graficienii care au întârziat să predea frame-urile.


a) cu sincronizare:
SELECT nume, prenume
FROM salariat
WHERE EXISTS
(SELECT *
FROM realizeaza r
WHERE salariat.cod_salariat=r.cod_salariat
AND data_lim < SYSDATE);
b) fără sincronizare:
SELECT nume, prenume
FROM salariat
WHERE cod_salariat IN
(SELECT DISTINCT cod_salariat
FROM realizeaza
WHERE data_lim < SYSDATE);

50.Afişaţi toate limbile în care nu există nici un film în inventarul magazinului de


produse video.
SELECT LIMBA_COD, LIMBA_NUME
FROM LIMBA
WHERE LIMBA_COD NOT IN
(SELECT DISTINCT LIMBA_COD
FROM FILM_LIMBA)
ORDER BY LIMBA_COD

51.Să se determine revistele coordonate de redactori şefi care nu cunosc limba în


care sunt scrise. Se ştie că în urma inspectării vizuale a rezultatului interogării se
poate decide schimbarea redactorilor şefi ai revistelor respective, de aceea se
doreşte blocarea înregistrărilor găsite.
SELECT p.nr_publicatie
FROM salariat s, publicatie p
WHERE s.cod_salariat = p.cod_salariat
AND p.limba NOT IN
(SELECT limba_cun
FROM limba
WHERE limba.cod_salariat = s.cod_salariat)
FOR UPDATE OF p.cod_salariat;

52.Proprietarul magazinului vrea să transmită prin poştă un cupon valoric tuturor


clienţilor care au plătit mai mult de 15$ pentru o singură tranzacţie de închiriere.
SELECT DISTINCT CLIENT_CONT_ID
FROM CLIENT_TRANZACTIE A
WHERE 15 < (SELECT SUM (INCHIRIAT_TAXA)
FROM FILM_INCHIRIATB
WHERE A.TRANZACTIE _ID = B.TRANZACTIE_ID)
53.Proprietarul magazinului vrea să vadă efectul recentei creşteri de preţuri şi are
nevoie de o listă a tranzacţiilor (TRANZACTIE_ID) în care clientul a plătit mai
mult decât taxa medie (INCHIRIAT_TAXA) pentru un film. Iată cum arată
interogarea:
a)SELECT DISTINCT TRANZACTIE_ID
FROM FILM_INCHIRIAT
WHERE INCHIRIAT_TAXA>
(SELECT AVG(INCHIRIAT_TAXA) FROM FILM_INCHIRIAT)
Incluzand si data tranzitiei:
b)SELECT TRANZACTIE_ID, TRANZACTIE_DATA AS TRANZ_DATA
FROM CLIENT_TRANZACTIE
WHERE TRANZACTIE_ID IN
(SELECT DISTINCT TRANZACTIE_ID FROM FILM_INCH,
WHERE INCH_TAXA > (SELECT AVG ( INCHIRIAT_TAXA)
FROM FILM_INCHIRIAT

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;

55.Lista cu copiile filmelor din tabelul FILM_COPY care nu au fost vândute şi


care au fost închiriate dar nu au fost încă returnate .
a)SELECT FILM_ID, COPY_NUMAR, DATA_RETURNARII
FROM FILM_COPY JOIN FILM__INCHIRIAT
USING (FILM_ID, COPY_NUMAR)
WHERE DATA_VANZARE IS NULL
AND RETUR_DATA IS NULL;
Sau
b)SELECT A.FILM_ID, A.COPY_NUMAR, DATA_RETURNARII
FROM FILM_COPY A, FILM_INCH B
WHERE A.FILM_ID = B.FILM_ID
AND A.COPY_NUMAR = B.COPY_NUMAR
AND DATA_VANZARE IS NULL
AND RETURN_DATA IS NULL;

56.Numărul maxim de închirieri ale unui singur film;


SELECT MAX(INCHIRIAT_NUMAR) AS MAX_INCHIRIAT_NUMAR
FROM (SELECT FILM_ID, NUMAR(*) AS INCHIRIAT_NUMAR
FROM FILM_INCHIRIAT GROUP BY FILM_ID)

57.Să se obţină lista celor mai scumpe cărţi.


SELECT titlu
FROM carte
WHERE pret = (SELECT MAX(pret)
FROM carte);

58.Să se obţină lista scriitorilor care au în bibliotecă un număr de exemplare mai


mare decât numărul mediu al cărţilor din bibliotecă.
SELECT DISTINCT autor
FROM carte
WHERE nrex > (SELECT AVG(nrex)
FROM carte);

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);

60.Să se obţină codurile şi titlurile cărţilor împrumutate.


SELECT carte.codel, titlu
FROM carte, imprumuta
WHERE carte.codel = imprumuta.codel;

61.Să se obţină lista cititorilor care au împrumutat cel puţin o carte.


SELECT nume
FROM cititor
WHERE codec IN (SELECT DISTINCT codec
FROM imprumuta);
62.Să se obţină codurile cititorilor care nu au împrumutat niciodată cărţi.
SELECT codec
FROM cititor
WHERE codec NOT IN
(SELECT DISTINCT codec
FROM imprumuta);

63.Să se obţină lista cititorilor care sunt în întârziere cu predarea cărţilor.


SELECT nume
FROM cititor
WHERE codec IN (SELECT DISTINCT codec
FROM imprumuta
WHERE dataef IS NULL
AND dares<SYSDATE);

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‟));

65.Să se obţină numele cititorilor care nu au împrumutat nici o carte scrisă de


ZOLA.
SELECT nume
FROM cititor
WHERE codec NOT IN
(SELECT DISTINCT codec
FROM imprumuta
WHERE codel IN
(SELECT codel
FROM carte
WHERE autor=‟ZOLA‟));
Operatorul IN poate fi înlocuit cu = ANY (un element este în listă dacă şi numai
dacă este egal cu un element al listei), iar operatorul NOT IN poate fi înlocuit prin
!=ALL.

66.Să se obţină codurile cititorilor care au împrumutat o carte de algebră.


SELECT DISTINCT codec
FROM imprumuta
WHERE codel IN
(SELECT codel
FROM carte
WHERE coded=
(SELECT coded
FROM domeniu
WHERE intdom=‟ALGEBRA‟));

67.Să se obţină cititorii care au împrumutat numai cărţi scrise de „ZOLA‟.


SELECT nume
FROM cititor
WHERE codec NOT IN
(SELECT DISTINCT codec
FROM imprumuta
WHERE codel NOT IN
(SELECT codel
FROM carte
WHERE autor=‟ZOLA‟));

68.Să se obţină numele cititorilor care au împrumutat cel puţin o carte de


informatică (procedural).
SELECT nume
FROM cititor
WHERE codec IN
(SELECT DISTINCT codec
FROM imprumuta
WHERE codel IN
(SELECT codel
FROM carte
WHERE coded=
(SELECT coded
FROM domeniu
WHERE intdom= ‟INFORMATICA‟)));
69.Să se obţină numele cititorilor şi titlurile cărţilor de informatică împrumutate de
aceşti cititori (relational).
SELECT nume, titlu
FROM cititor, carte, imprumuta, domeniu
WHERE imprumuta.codel = carte.codel
AND carte.coded = domeniu.coded
AND imprumuta.codec = cititor.codec
AND intdom = ‟INFORMATICA‟;

70.Să se obţină, utilizând sincronizarea subcererii cu cererea principală, titlurile


cărţilor care au toate exemplarele împrumutate (se selectează un titlu din carte şi
pentru acest titlu se numără câte exemplare sunt împrumutate).
SELECT titlu
FROM carte
WHERE nrex=(SELECT COUNT(*)
FROM imprumuta
WHERE codel = carte.codel
AND dataef IS NULL);

71.Să se obţină codurile cititorilor şi codul ultimei cărţi împrumutate.


SELECT codec, codel
FROM imprumuta i
WHERE dataim>=ALL (SELECT dataim
FROM imprumuta
WHERE codec=i.codec);
Pentru această interogare, clauza WHERE putea fi scrisă şi sub forma:
WHERE dataim=(SELECT MAX(dataim)
FROM imprumuta
WHERE codec=i.codec);

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);

74.Să se obţină titlurile cărţilor care sunt momentan împrumutate.


a)Soluţia 1 (cu sincronizare):
b)Soluţia 2 (fără sincronizare):
SELECT titlu
SELECT titlu
FROM carte
FROM carte
WHERE EXISTS
WHERE codel IN
(SELECT * (SELECT DISTINCT codel
FROM imprumuta FROM imprumuta
WHERE codel = carte.codel WHERE dataef IS NULL);
AND dataef IS NULL);

75.Să se obţină codurile cărţilor care nu au fost împrumutate niciodată.


a)Soluţia 1 (cu sincronizare)
SELECT codel
FROM carte
WHERE NOT EXISTS
(SELECT codel
FROM imprumuta
WHERE codel = carte.codel);
b)Soluţia 2 (fără sincronizare)
SELECT codel
FROM carte
WHERE codel NOT IN
(SELECT DISTINCT codel
FROM imprumuta);

76.Să se afişeze codurile cititorilor care nu au împrumutat cărţi.


SELECT codec
FROM cititor
MINUS
SELECT DISTINCT codec
FROM imprumuta;

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);

78.Să se obţină codurile cititorilor care au împrumutat aceleaşi cărţi ca şi cititorul


având un cod specificat. SELECT codec
FROM imprumuta i
WHERE NOT EXISTS
(SELECT codel
FROM imprumuta
WHERE codec=i.codec
MINUS
SELECT codel
FROM imprumuta
WHERE codec=‟&ccc‟)
AND NOT EXISTS
(SELECT codel
FROM imprumuta
WHERE codec=‟&ccc‟
MINUS
SELECT codel
FROM imprumuta
WHERE codec=i.codec)
AND codec!=‟&ccc‟);

79.Să se obţină numele cititorilor care au împrumutat cel puţin o carte.


a)Soluţia 1 (forma relaţională):
SELECT DISTINCT nume
FROM cititor,imprumuta
WHERE cititor.codec=imprumuta.codec;
b)Soluţia 2 (forma procedurală):
SELECT nume
FROM cititor
WHERE codec IN
(SELECT DISTINCT codec
FROM imprumuta);

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;