Sunteți pe pagina 1din 50

Universitatea Constantin Brncui din Trgu-Jiu

Facultatea de Inginerie
Departamentul de Automatic, Energie i Mediu

BAZE DE DATE
LECTOR DR. ADRIAN RUNCEANU

10.05.2013

Curs - BAZE DE DATE

Curs 7
Limbajul SQL

10.05.2013

Curs - BAZE DE DATE

Limbajul SQL
7.2. JOIN-urile ANSI/ISO SQL99
7.2.1. Cross join
7.2.2. Natural join
7.2.3. Using clause
7.2.4. Full (two sided) outer joins
7.2.5. Arbitrary join conditions for outer
joins
7.3. Operatorii pe mulimi

10.05.2013

Curs - BAZE DE DATE

Cross Joins and Natural Joins


NATURAL JOIN
Este un ANSI/ISO SQL:1999 join echivalent cu equijoin-ul.
Se face pe baza tuturor coloanelor care au acelai nume

din 2 tabele; coloanele respective trebuie s aib acelai


tip de date.
Sunt selectate liniile care au valori egale n toate
coloanele corespondente.
Exemplu:

SELECT id_dept
FROM angajati NATURAL JOIN departamente

10.05.2013

Curs - BAZE DE DATE

Cross Joins and Natural Joins


Exemplu:
SELECT id_angajat, nume, id_dept, locatie
FROM angajati NATURAL JOIN departamente

10.05.2013

Curs - BAZE DE DATE

Cross Joins and Natural Joins


CROSS JOIN
Realizeaz produsul cartezian pentru dou tabele.
Exemplu:
SELECT nume, denumire
FROM angajati CROSS JOIN departamente
este echivalent cu instruciunea:

SELECT nume, denumire


FROM angajati, departamente

10.05.2013

Curs - BAZE DE DATE

Cross Joins and Natural Joins


APLICAII

1) Creai un cross-join care afieaz numele i


denumirea departmentului din tabelele angajati i
departamente.
2) Creai o interogare care folosete un natural join
pentru a pune n legtur tabelele departamente i
locatii cu ajutorul coloanei id_locatie. Afiai id-ul i
denumirea departamentului, id-ului locaiei i oraul.

10.05.2013

Curs - BAZE DE DATE

Cross Joins and Natural Joins


1) Creai un cross-join care afieaz numele i
denumirea departmentului din tabelele
angajati i departamente.
SELECT nume, denumire
FROM angajati
CROSS JOIN departamente

10.05.2013

Curs - BAZE DE DATE

Cross Joins and Natural Joins


2) Creai o interogare care folosete un natural join
pentru a pune n legtur tabelele departamente
i locatii cu ajutorul coloanei id_locatie. Afiai idul i denumirea departamentului, id-ului locaiei i
oraul.
SELECT id_dept, denumire, id_locatie, oras
FROM departamente
NATURAL JOIN locatii

10.05.2013

Curs - BAZE DE DATE

10

Limbajul SQL
7.2. JOIN-urile ANSI/ISO SQL9
7.2.1. Cross join
7.2.2. Natural join
7.2.3. Using clause
7.2.4. Full (two sided) outer joins
7.2.5. Arbitrary join conditions for outer
joins
7.3. Operatorii pe mulimi

10.05.2013

Curs - BAZE DE DATE

11

Join Clauses
n aceast parte vom studia:
1. folosirea clauzelor USING i ON
2. realizarea unui join cu 3 tabele
1. Clauza USING
ntr-un natural join, dac tabelele au coloane cu
acelai nume dar tipuri diferite, se produce eroare.
Pentru a evita aceast situaie, clauza JOIN se
nlocuiete cu clauza USING.

10.05.2013

Curs - BAZE DE DATE

12

Join Clauses
Clauza USING specific coloanele care ar
trebui folosite pentru pentru equijoin.
Coloana specificat n clauza USING nu
trebuie s aib nici un specificator (nume de
tabela sau alias), n nici o parte din
instruciunea SELECT.

10.05.2013

Curs - BAZE DE DATE

13

Join Clauses
Exemplu:

SELECT a.id_angajat, a.nume. d.id_locatie


FROM angajati a
JOIN departmente d
USING (id_dept)

10.05.2013

Curs - BAZE DE DATE

14

Join Clauses
Clauza ON
Dac coloanele folosite pentru join au denumiri
diferite sau dac sunt folosii operatorii: <, > sau
BETWEEN, atunci nu putem folosi clauza USING.
n aceast situaie se folosete clauza ON.
Aceasta permite specificarea unei game variate
de condiii pentru join-uri.
De asemenea, clauza ON ne permite s
folosim WHERE pentru a restriciona linii dintr-o
tabel sau din ambele tabele.

10.05.2013

Curs - BAZE DE DATE

15

Join Clauses
Exemple:

1) SELECT a.nume as "ANG", d.nume as "MGR"


FROM angajati a JOIN angajati d
ON (a.manager_id = d.angajat_id);
Se realizeaz un self-join pentru a selecta
acei angajai care sunt i manageri.

10.05.2013

Curs - BAZE DE DATE

16

Join Clauses
2) folosirea clauzei WHERE

SELECT a.nume as "ANG", m.nume as "MGR"


FROM angajati a JOIN angajati m
ON (a.manager_id = m.angajat_id)
WHERE a.nume like 'V%';

10.05.2013

Curs - BAZE DE DATE

17

Limbajul SQL
7.2. JOIN-urile ANSI/ISO SQL99
7.2.1. Cross join
7.2.2. Natural join
7.2.3. Using clause
7.2.4. Full (two sided) outer joins
7.2.5. Arbitrary join conditions for outer
joins
7.3. Operatorii pe mulimi

10.05.2013

Curs - BAZE DE DATE

18

Join Clauses
Realizarea unui join cu 3 tabele
Ambele clauze (ON si USING) se pot folosi
pentru un astfel de join.
SELECT id_angajat, oras, denumire
FROM angajati a JOIN departamente d
ON (d.id_dept = a.id_dept)
JOIN locatii l
ON (d.id_locatie = l.id_locatie)

10.05.2013

Curs - BAZE DE DATE

19

Join Clauses
Comparatie intre join-urile proprietate ORACLE si join-urile
ANSI/ISO SQL 1999

Join-uri proprietate
ORACLE

Produs cartezian

Equijoin

Non-equijoin

Join-uri ANSI/ISO SQL 1999

Cross Join
Natural Join (daca coloanele de join au
acelasi nume si acelasi tip de date)
Clauza USING (daca coloanele de join
au acelasi nume dar tipuri de date
diferite)
Clauza ON (daca coloanele au nume
diferite)
Clauza ON

10.05.2013

Curs - BAZE DE DATE

20

Join Clauses
APLICAII
1) Realizai un join ntre tabelele locatii i
departmente folosind coloana id_locatie. Limitai
rezultatele doar pentru locaia 1400.
2) Afiai: oraul, numele departamentului, id-ul
locaiei i id-ul departamentului pentru
departamentele 10, 20 i 30, pentru oraul TrguJiu.

10.05.2013

Curs - BAZE DE DATE

21

Join Clauses
1) Realizai un join ntre tabelele locatii i
departmente folosind coloana id_locatie. Limitai
rezultatele doar pentru locaia 1400.

SELECT l.oras, d.denumire


FROM locatii l JOIN departamente d
USING (id_locatie)
WHERE id_locatie = 1400;

10.05.2013

Curs - BAZE DE DATE

22

Join Clauses
2) Afiai: oraul, numele departamentului, id-ul
locaiei i id-ul departamentului pentru
departamentele 10, 20 i 30, pentru oraul TrguJiu.
SELECT l.oras, d.denumire, id_locatie, d.id_dept
FROM locatii l JOIN departamente d
USING (id_locate)
WHERE oras = Targu-Jiu'
AND id_dept IN (10, 20, 30);

10.05.2013

Curs - BAZE DE DATE

23

Limbajul SQL
7.2. JOIN-urile ANSI/ISO SQL99
7.2.1. Cross join
7.2.2. Natural join
7.2.3. Using clause
7.2.4. Full (two sided) outer joins
7.2.5. Arbitrary join conditions for outer
joins
7.3. Operatorii pe mulimi

10.05.2013

Curs - BAZE DE DATE

24

Inner vs. Outer Joins


n ANSI-99 SQL, un join cu 2 sau mai multe
tabele care returneaz doar liniile care se
potrivesc se numete inner join.
Atunci cnd un join returneaz att liniile
care se potrivesc ct i cele care nu se potrivesc,
acesta se numete outer join.
Sunt trei tipuri de outer join n ANSI/ISO SQL:
1. LEFT OUTER JOIN
2. RIGHT OUTER JOIN
3. FULL OUTER JOIN

10.05.2013

Curs - BAZE DE DATE

25

Inner vs. Outer Joins


1. LEFT OUTER JOIN
Sunt afiai i acei angajai care nu au
desemnat un id_dept (tabela departamente este
cea deficitar).
SELECT a.nume, a.id_dept, d.denumire
FROM angajati a
LEFT OUTER JOIN departamente d
ON (a.id_dept = d.id_dept);

10.05.2013

Curs - BAZE DE DATE

26

Inner vs. Outer Joins


2. RIGHT OUTER JOIN
Sunt afiate i acele departamente care nu au
angajai.
SELECT a.nume, a.id_dept, d.denumire
FROM angajati a
RIGHT OUTER JOIN departamente d
ON (a.id_dept = d.id_dept);

10.05.2013

Curs - BAZE DE DATE

27

Inner vs. Outer Joins


3. FULL OUTER JOIN
Returneaz att liniile care se potrivesc ct i
cele care nu se potrivesc din ambele tabele.
Spre deosebire de outer join-ul proprietatea
Oracle, care nu permitea folosirea operatorului (+)
n ambele pri ale clauzei WHERE, full outer joinul permite acest lucru.

SELECT a.nume, a.id_dept, d.denumire


FROM angajati a
FULL OUTER JOIN departamente d
ON (a.id_dept = d.id_dept);

10.05.2013

Curs - BAZE DE DATE

28

Inner vs. Outer Joins


APLICAII
1) Afiai numele, prenumele, i denumirea departamentului
pentru toi angajaii, inclusiv pentru cei care nu sunt
desemnai la nici un departament.
2) Afiai numele, prenumele, i denumirea departamentului
pentru toi angajaii, inclusiv acele departamente care nu
au nici un angajat asociat.
3) Afiai numele, prenumele, i denumirea departamentului
pentru toi angajatii, inclusiv acele departamente care nu
au nici un angajat asociat i acei angajai care nu sunt
desemnai nici unui departament.

10.05.2013

Curs - BAZE DE DATE

29

Limbajul SQL
7.2. JOIN-urile ANSI/ISO SQL99
7.2.1. Cross join
7.2.2. Natural join
7.2.3. Using clause
7.2.4. Full (two sided) outer joins
7.2.5. Arbitrary join conditions for outer
joins
7.3. Operatorii pe mulimi

10.05.2013

Curs - BAZE DE DATE

30

Inner vs. Outer Joins


1) Afiai numele, prenumele, i denumirea
departamentului pentru toi angajaii, inclusiv pentru
cei care nu sunt desemnai la nici un departament.

SELECT a.nume, a.prenume, d.denumire


FROM angajati a
LEFT OUTER JOIN departamente d
ON (a.id_dept = d.id_dept)

10.05.2013

Curs - BAZE DE DATE

31

Inner vs. Outer Joins


2) Afiai numele, prenumele, i denumirea
departamentului pentru toi angajaii, inclusiv acele
departamente care nu au nici un angajat asociat.

SELECT a.nume, a.prenume, d.denumire


FROM angajati a
RIGHT OUTER JOIN departamente d
ON (a.id_dept = d.id_dept)

10.05.2013

Curs - BAZE DE DATE

32

Inner vs. Outer Joins


3) Afiai numele, prenumele, i denumirea
departamentului pentru toi angajatii, inclusiv acele
departamente care nu au nici un angajat asociat i
acei angajai care nu sunt desemnai nici unui
departament.

SELECT a.nume, a.prenume, d.denumire


FROM angajati a
FULL OUTER JOIN departamente d
ON (a.id_dept = d.id_dept);

10.05.2013

Curs - BAZE DE DATE

33

Inner vs. Outer Joins


ALTE APLICAII:
1. S se afieze: id_functie, funcia, numele, prenumele, i
id-ul departamentului pentru toi angajaii cu id_functie
corespunztor pentru IT_PROG.
2. Afiai numele i numrul pentru angajai mpreun cu
numele i numrul managerului. Denumii coloanele astfel:
Angajat, Ang#, Manager, i Mgr#.
3. Modificai rezultatul de la problema 2 astfel nct s fie
afiai toi angajaii, inclusiv aceia care nu au manager.
Ordonai rezultatele dup numrul angajatului.

10.05.2013

Curs - BAZE DE DATE

34

Inner vs. Outer Joins


1. S se afieze: id_functie, funcia, numele, prenumele, i id-ul
departamentului pentru toi angajaii cu id_functie corespunztor
pentru IT_PROG.

SELECT f.id_functie, f.functia, a.nume, a.prenume,


a.id_dept
FROM functii f
JOIN angajati a
ON( f.id_functie = a.id_functie)
WHERE f.id_functie = 'IT_PROG';

10.05.2013

Curs - BAZE DE DATE

35

Inner vs. Outer Joins


2. Afiai numele i numrul pentru angajai mpreun cu
numele i numrul managerului. Denumii coloanele
astfel: Angajat, Ang#, Manager, i Mgr#.

SELECT

w.nume AS Angajat",
w.id_angajat AS Ang#",
m.nume AS "Manager",
m. id_angajat AS "Mgr#"
FROM angajat w JOIN angajat m
ON (w.id_manager = m.id_angajat);

10.05.2013

Curs - BAZE DE DATE

36

Inner vs. Outer Joins


3. Modificai rezultatul de la problema 2 astfel nct s fie afiai toi
angajaii, inclusiv aceia care nu au manager. Ordonai rezultatele dup
numrul angajatului.

SELECT

w.nume AS Angajat",
w.id_angajat AS Ang#",
m.nume AS "Manager",
m.id_angajat AS "Mgr#"
FROM angajati w
LEFT OUTER JOIN angajati m
ON (w.id_manager = m.id_angajati)
ORDER BY w. id_angajati;

10.05.2013

Curs - BAZE DE DATE

37

Limbajul SQL
7.2. JOIN-urile ANSI/ISO SQL99
7.2.1. Cross join
7.2.2. Natural join
7.2.3. Using clause
7.2.4. Full (two sided) outer joins
7.2.5. Arbitrary join conditions for outer
joins
7.3. Operatorii pe mulimi

10.05.2013

Curs - BAZE DE DATE

38

Operatorii pe mulimi
Operatorii pe mulimi combin rezultatele
obinute din dou sau mai multe interogri.
Cererile care conin operatori pe mulimi
se numesc cereri compuse.
Exist patru operatori pe mulimi:
1. UNION
2. UNION ALL
3. INTERSECT
4. MINUS

10.05.2013

Curs - BAZE DE DATE

39

Operatorii pe mulimi
Toi operatorii pe mulimi au aceeai
preceden.
Dac o instruciune SQL conine mai muli
operatori pe mulimi, server-ul Oracle evalueaz
cererea de la stnga la dreapta (sau de sus n jos).
Pentru a schimba aceast ordine de evaluare,
se pot utiliza paranteze.

10.05.2013

Curs - BAZE DE DATE

40

Operatorii pe mulimi
Operatorul UNION returneaz toate liniile

selectate de dou cereri, eliminnd


duplicatele.
Acest operator nu ignor valorile null i are

preceden mai mic dect operatorul IN.

10.05.2013

Curs - BAZE DE DATE

41

Operatorii pe mulimi
Operatorul UNION ALL returneaz toate

liniile selectate de dou cereri, fr a


elimina duplicatele.
Precizrile fcute asupra operatorului
UNION sunt valabile i n cazul
operatorului UNION ALL.
n cererile asupra crora se aplic UNION
ALL nu poate fi utilizat cuvntul cheie
DISTINCT.

10.05.2013

Curs - BAZE DE DATE

42

Operatorii pe mulimi
Operatorul INTERSECT returneaz toate

liniile comune cererilor asupra crora se


aplic.
Acest operator nu ignor valorile null.

10.05.2013

Curs - BAZE DE DATE

43

Operatorii pe mulimi
Operatorul MINUS determin liniile

returnate de prima cerere care nu apar n


rezultatul celei de-a doua cereri.
Pentru ca operatorul MINUS s

funcioneze, este necesar ca toate


coloanele din clauza WHERE s se afle i
n clauza SELECT.

10.05.2013

Curs - BAZE DE DATE

44

Operatorii pe mulimi

Observaii:
1. n mod implicit, pentru toi operatorii cu

excepia lui UNION ALL, rezultatul este


ordonat cresctor dup valorile primei
coloane din clauza SELECT.
2. Pentru o cerere care utilizeaz operatori pe
mulimi, cu excepia lui UNION ALL, server-ul
Oracle elimin liniile duplicat.

10.05.2013

Curs - BAZE DE DATE

45

Operatorii pe mulimi
1. n instruciunile SELECT asupra crora se

aplic operatori pe mulimi, coloanele


selectate trebuie s corespund ca numr
i tip de date.
2. Nu este necesar ca numele coloanelor s
fie identice.
3. Numele coloanelor din rezultat sunt
determinate de numele care apar n clauza
SELECT a primei cereri.

10.05.2013

Curs - BAZE DE DATE

46

Operatorii pe mulimi
APLICAII:
1. S se afieze: codurile departamentelor al cror nume conine
irul re sau n care lucreaz angajai avnd codul job-ului ing.
SELECT id_dept "Cod departament"
FROM angajati
WHERE UPPER(id_functie)='ing'
UNION
SELECT id_dept
FROM departamente
WHERE LOWER(denumire) LIKE '%re%';

10.05.2013

Curs - BAZE DE DATE

47

Operatorii pe mulimi
2. S se obin codurile departamentelor n care nu
lucreaz nimeni (nu este introdus nici un salariat n
tabelul angajati).
Se cer dou soluii.
Obs: Operatorii pe mulimi pot fi utilizai n subcereri.
Coloanele care apar n clauza WHERE a interogrii
trebuie s corespund, ca numr i tip de date, celor
din clauza SELECT a subcererii.

10.05.2013

Curs - BAZE DE DATE

Operatorii pe mulimi
Soluia 1
SELECT id_dept "Cod departament"
FROM departamente
MINUS
SELECT id_dept
FROM angajati;

48

10.05.2013

Curs - BAZE DE DATE

Operatorii pe mulimi
Soluia 2
SELECT id_dept
FROM departamente
WHERE id_dept NOT IN
(SELECT DISTINCT NVL(id_dept,0)
FROM angajati);

49

10.05.2013

Curs - BAZE DE DATE

ntrebri?

50

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