Sunteți pe pagina 1din 6

Baze de Date

Lucrare laborator 6

Obiective
Subinterogări

1. Subinterogări

O subinterogare presupune utilizarea unei instrucț iuni SELECT în cadrul altei


instrucț iuni SQL.
Exemplu:
SELECT * FROM t1 WHERE column1 IN (SELECT column1 FROM t2);

În exemplul prezentat, SELECT * FROM t1 ... este interogarea exterioară, iar (SELECT
column1 FROM t2) este subinterogare. O subinterogare poate conț ine la rândul ei alte
subinterogări. Ele trebuie să fie delimitate tot timpul de paranteze.
Avantajele principale ale subinterogărilor:
Permit structurarea interogărilor, deoarece este posibilă izolarea secț iunilor unei
instrucț iuni.
Reprezintă o alternativă a interogărilor care implică operaț ii complexe de joncț iune
ș i uniune.
Se consideră că sunt mai uș or de urmărit decât joncț iunile complexe. Introducerea
subinterogărilor în limbajul SQL a determinat denumirea acestuia ca „Limbaj de
interogare structurat” ( Structured Query Language).
Principalul dezavantaj în utilizarea interogărilor este că în multe cazuri sunt depăș ite ca
performanț ă în execuț ie de interogările echivalente care utilizează joncț iuni.
O subinterogare poate returna o valoare unică, o linie de tabel, o coloană a unui tabel, sau un
tabel (una sau mai multe linii ș i coloane). În funcț ie de valoarea returnată, ele sunt numite
subinterogări scalare, subinterogări coloană, subinterogări linie sau subinterogări tabel.
Subinterogarea poate fi plasata în una din următoarele clauze: WHERE, HAVING,
FROM, SELECT.
Subinterogarea se execută prima dată, iar rezultatul este folosit pentru obţinerea
rezultatului de către interogarea principală (outer query).

2. Utilizarea subinterogărilor în clauza WHERE

Subinterogările sunt utilizate cel mai frecvent în clauza WHERE. Ele poartă denumirea
ș i de subinterogări imbricate (nested subqueries).
Baze de Date

Sintaxa generală în acest caz este:

SELECT lista_de_coloane1
FROM lista_tabele1
WHERE expresie operator
(SELECT lista_coloane2
FROM lista_tabele2
WHERE conditii);

Unde operator poate fi unul din operatorii [NOT] IN, EXIST, ANY, ALL, SOME,<, >...

În funcț ie de rezultatul returnat, subinterogările sunt de două tipuri:


1) single-row subqueries – care folosesc operatorii single-row >,=,>=,<,<= şi dau ca rezultat
o singură linie.
2) multiple-row subqueries – care folosesc operatorii multiple-row IN, ANY, ALL şi dau ca
rezultat mai multe linii.

2.1. Subinterogări single-row

Subinterogările single-row au ca rezultat o singură linie.

Exemple:
1.Să se afiș eze angajaț ii care lucrează în acelaș i departament cu angajatul cu id-ul 110.

SELECT last_name || ' ' || first_name AS Angajat, employee_id


FROM Employees
WHERE department_id =
(SELECT department_id
FROM Employees
WHERE employee_id=110);

2.Aflaț i numele angajaț ilor care au salariul mai mare decât angajatul cu numele Luis Popp.

SELECT last_name, first_name


FROM Employees
WHERE salary >
(SELECT salary
FROM Employees
WHERE first_name=‘Luis’ AND last_name=’Popp’);
Baze de Date

3.Să se afiș eze angajaț ii care au un salariu mai mic decât salariul mediu.

SELECT last_name, first_name


FROM Employees
WHERE salary <
(SELECT AVG(salary)
FROM Employees);

4.Afiș aț i angajaț ii al căror job este acelaș i cu cel al angajatului cu numărul 157 ș i al
căror salariu este mai mare decât cel al angajatului cu numărul 110.

SELECT last_name, first_name


FROM Employees
WHERE job_id =
(SELECT job_id
FROM Employees
WHERE employee_id = 157)
AND salary >
(SELECT salary
FROM Employees
WHERE employee_id = 110);

2.2. Subinterogări multiple-row

Subinterogările multiple-row sunt acele subinterogări care dau ca rezultat mai multe
valori. Folosesc operatorii multiple row: IN, ANY, ALL. Operatorul NOT poate fi folosit în
combinaţie cu oricare dintre aceştia.

Exemple:
1.Să se afiș eze angajaț ii care lucrează în acelaș i departament cu angajatul cu numele King.

SELECT last_name, first_name, department_id


FROM Employees
WHERE department_id IN
(SELECT department_id
FROM Employees
WHERE last_name='King');
Baze de Date

2.Aflaț i numele angajaț ilor care au salariul mai mare decât toț i angajaț ii din
departamentul 50.

SELECT last_name, first_name, salary


FROM Employees
WHERE salary > ALL
(SELECT salary
FROM Employees
WHERE department_id=50);

3.Aflaț i numele angajaț ilor care au salariul mai mare decât vreun angajat din departamentul
50.

SELECT last_name, first_name, salary


FROM Employees
WHERE salary > ANY
(SELECT salary
FROM Employees
WHERE department_id=50);

3. Subinterogări corelate

Serverul Oracle realizează o subinterogare corelata când o subinterogare face referinț ă


la o coloana a tabelului referit in interogarea principala. În acest caz, subinterogarea este
evaluată câte o dată pentru fiecare rând procesat de declaraț ia părinte.
Sintaxa generala pentru subinterogările corelate este:

SELECT col1, col2,...


FROM tabel1 alias1
WHERE coli operator
(SELECT col1, col2,...
FROM tabel2
WHERE expr1 = alias1.expr2)

În interogările corelate se pot folosi operatorii ANY si ALL.


Tipic, subinterogarile corelate se folosesc împreuna cu operatorul EXISTS.

Exemple:
1.Să se găsească toț i angajaț ii care câș tigă mai mult decât media salariilor din
departamentele în care lucrează.
Baze de Date

SELECT last_name, salary, department_id


FROM employees e
WHERE salary >
(SELECT AVG(salary)
FROM Employees
WHERE department_id = e.department_id);

2.Să se afiș eze detalii despre acei angajaț i care ș i-au schimbat funcț iile (job-ul) de cel
puț in două ori.

SELECT e.employee_id,last_name, e.job_id


FROM employees e
WHERE 2 <= (SELECT count (*)
FROM job_history
WHERE employee_id = e.employee_id);

4. Exerciții
1. Afiș aț i angajaț ii care au acelaș i job cu Luis Popp.
2. Afiș aț i angajaț ii care s-au angajat la aceeaș i dată cu Luis Popp sau după acesta.
3. Afiș aț i angajaț ii care câș tigă mai mult decât oricare funcț ionar (CLERK).
4. Afiș aț i numele departamentelor din Seattle.
5. Afiș aț i numele departamentelor aflate în aceeaș i locaț ie cu departamentul
Finance.
6. Afiș aț i angajaț ii care lucrează într-un departament cu măcar un angajat al cărui
nume începe cu litera A.
7. Afiș aț i angajaț ii care au subordonaț i (sunt manageri).
8. Afiș aț i angajaț ii care nu au subordonaț i (nu sunt manageri).
9. Afiș aț i locaț iile în care nu există niciun departament.
10. Afiș aț i numele, data angajarii (hire_date) si salariul pentru toti angajatii care au
acelasi salariu si comision precum Kochhar.
11. Găsiţi numele pentru toţi angajaţii ale căror salarii sunt aceleaşi cu salariul minim din
oricare departament.
12. Afiș aț i toț i salariaț ii care s-au angajat după toț i angajaț ii din departamentul
numărul 30.
13. Afiș aț i angajaț ii care lucrează în acelaș i departament cu angajatul cu numele
Taylor ș i au acelaș i salariu cu anagajatul cu numărul 199.
14. Afiș aț i angajaț ii care câș tigă salariul maxim din departamentul în care lucrează.
15. Afiș aț i angajatii care au salariul mai mare decât jumătate din salariul maxim setat
pentru tipul lor de job.
Baze de Date

16. Găsiț i numele ș i salariul fiecărui angajat care este subordonat managerului cu
numele King.

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