Documente Academic
Documente Profesional
Documente Cultură
Obiective :
Obs.: In acesta prelegere, veti invata cum sa scrieti subinterogari de coloane multiple si subinterogari in
clauza FROM a secventei SELECT
Interogare principala
MANAGER 10
Subinterogare
SALESMAN 30
MANAGER 10
CLERK 20
Pana acum ati scris subinterogari folosind o singura linie si linii multiple , unde o singura coloana a fost
comparata in clauza WHERE sau clauza HAVING a instructiunii SELECT.
Daca vreti sa comparati una sau mai multe coloane, trebuie sa scrieti clauza WHERE ,folosind
operatorii logici.
Acest tip de subinterogari va da posibilitatea sa realizati din doua clauze WHERE una singura.
Sintaxa :
SELECT coloana,coloana,…
FROM tabela
WHERE (coloana,coloana,…) IN
(SELECT colana,coloana…
FROM tabela
WHERE conditie);
JAMES 30 950
WARD 30 1250 500
MARTIN 30 1250 1400
TURNER 30 1500 0
ALLEN 30 1600 300
BLAKE 30 2850
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
3
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 :
JAMES 30 950
BLAKE 30 2850
TURNER 30 1500 0
ALLEN 30 1600 300
WARD 30 1250 500
MARTIN 30 1250 1400
6 row selected.
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
JAMES 30 950
WARD 30 1250 500
MARTIN 30 1250 1400
TURNER 30 1500 0
ALLEN 30 1600 300
BLAKE 30 2850
6 rows selected.
Subinterogare nepereche
JAMES 30 950
BLAKE 30 2850
TURNER 30 1500 0
CLARK 10 1500 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 .
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 :
4 (SELECT manager.mgr
5 FROM emp manager);
ENAME
KING
…
6 rows selected.
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.
7
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.