Академический Документы
Профессиональный Документы
Культура Документы
DEPTNO
JAMES
WARD
MARTIN
TURNER
ALLEN
BLAKE
30
30
30
30
30
30
SAL
950
1250
1250
1500
1600
2850
COMM
500
1400
0
300
6 row selected.
In exemplul de mai sus sunt folosite subinterogari de coloane multiple care returneaza mai mult de o
coloana. Aceasta compara coloana SAL si coloana COMM.
Selectia afiseaza numele, numarul departamentului, salariul, comisionul oricarui angajat a carui salariu si
comision se potrivesc cu salariul si comisionul oricarui angajat din departamentul 30.
Compararea coloanelor
Comparatiile coloanelor intr-o subinterogare de coloane multiple, poate fi in perechi sau in neperechi . In
exemplul anterior, o comparatie pereche a fost executata in clauza WHERE . Fiecare linie returnata de
comanda SELECT trebuie sa aiba accelasi salar si comision cu a unui angajat din departamentul 30 .
Daca vreti o comparatie nepereche (complexa) , trebuie sa folositi clauza WHERE cu multiple conditii .
Exemplul urmator foloseste comparatia nepereche (complexa) pentru a afisa numele, numarul
departamentului, salarul si comisionul oricarui angajat a carui salariu si comision se potrivesc cu salariul
si comisionul oricarui angajat din departamentul 30 :
SQL>SELECT ename, deptno, sal, comm
2 FROM emp
3 WHERE sal IN
(SELECT sal
4
FROM emp
5
WHERE deptno=30)
6 AND
7
NVL(comm, -1) IN
(SELECT NVL(comm, -1)
8
FROM emp
9
WHERE deptno=30);
Rezultatul cererii de mai sus :
ENAME
DEPTNO
JAMES
BLAKE
TURNER
ALLEN
WARD
MARTIN
30
30
30
30
30
30
SAL
950
2850
1500
1600
1250
1250
COMM
0
300
500
1400
6 row selected.
Modificarea tabelei EMP
Se presupune ca salariul si comisionul lui Clark se modifica
Salariul se schimba in 1500$ si comisionul in 300$
Se presupune ca salariul si comisionul angajatului Clark se modifica astfel incat acesta are accelasi salariu
ca al oricarui angajat din departamentul 30 si accelasi comision ca al altui angajat din departamentul 30 .
Salariul lui Clark este acum egal cu al lui Turner (1500$) si comisionul cu cel al lui Allan (300$) .
Acum rulati o comparatie pereche si una nepereche pentru a determina numarul liniilor returnate de
fiecare interogare .
Subinterogare pereche
ENAME
DEPTNO
SAL
COMM
JAMES
WARD
MARTIN
TURNER
ALLEN
BLAKE
30
30
30
30
30
30
950
1250
1250
1500
1600
2850
500
1400
0
300
6 rows selected.
Subinterogare nepereche
SQL> SELECT ename , deptno , sal , comm
2
FROM emp
3 WHERE sal
IN (SELECT sal
4
FROM emp
5
WHERE deptno=30)
6 AND
7
NVL(comm,-1) IN
(SELECT NVL(comm,-1)
8
FROM emp
9
WHERE deptno=30);
ENAME
JAMES
BLAKE
TURNER
CLARK
DEPTNO
30
30
30
10
SAL
COMM
950
2850
1500
1500
0
300
7 row selected.
Rezultatul interogarii de mai sus include si angajatul Clark. Salariul acestuia este accelasi cu al lui
Turner si comisionul este accelasi cu al lui Allen .
(SELECT manager.mgr
FROM emp manager);
no rows selected.
Comanda SQL de mai sus afiseaza toti angajatii care nu au nici un subordonat. Logic ,acesta
interogare SQL ar trebui sa returneze 8 linii . Dar SQL nu returneaza nici una . Una din valoarea
returnata de interogare este o valoare nulla si prin urmare intreaga interogare nu returneaza nici o
linie.
Motivul este ca toate aceste conditii care compara rezultatul unei valori nulle se transforma in null .
Cand valorile nulle exista in rezultatul subinterogarii, nu folositi operatorul NOT IN .
Operatorul NOT IN este echivalent cu !=ALL . Aveti in vedere ca valorile nulle ale rezultatului
subinterogarii nu vor constitui o problema daca folositi operatorul IN . Operatorul IN este echivalent
cu operatorul ANY . De exemplu,pentru afisarea angajatilor care au subordonati , folositi urmatoarea
exprimare SQL :
SQL> SELECT employee.ename
2
FROM emp employee
3
WHERE employee.empno IN
4
5
(SELECT manager.mgr
FROM emp manager);
ENAME
KING
6 rows selected.
Folosirea unei subinterogari in clauza FROM
Se poate folosi o subinterogare in caluza FROM a exprimarii SELECT .
Exemplul urmator afiseaza numele angajatilor , salariile , numarul departamentelor si media salariilor
pentru toti angajatii care realizeaza mai mult decat media salariilor din departamentul in care
lucreaza.
SQL> SELECT a.ename , a.sal , a.deptno , b.salavg
2
FROM emp a , (SELECT deptno , AVG(sal) salavg
3
FROM emp
4
GROUP BY deptno ) b
5
WHERE a.deptno = b.deptno
6
AND
a.sal > b.salavg;
ENAME
KING
JONES
SCOTT
SAL
5000
2975
3000
DEPTNO
10
20
20
SALAVG
2916.6667
2175
2175
6 rows selected.
SUMAR :
Exercitii
1. Scrieti o interogare care sa afiseze numele , numarul departamentului si salariul oricarui angajat al
carui numar de departament si salariu sa se potriveasca cu numarul departamentului si salariul oricarui
angajat care percepe comision.
2. Afisati numele , numele departamentului si salariul oricarui angajat a carui salariu si comision se
potrivesc cu salariul si comisionul oricarui angajat localizat in Dallas.
3. Scrieti o interogare care sa afiseze numele , data angajarii si salariul pentru toti angajatii care au
acelasi salariu si comision ca al lui Scott.
4. Scrieti o interogare care sa afiseze angajatii care castiga un salariu mai mare ca a oricarui angajat
functionar (CLERK) . Afisati salariile de la cel mai mare la cel mai mic.