Documente Academic
Documente Profesional
Documente Cultură
Facultatea de Inginerie
Departamentul de Automatic, Energie i Mediu
BAZE DE DATE
LECTOR DR. ADRIAN RUNCEANU
10.05.2013
Curs 6
Limbajul SQL
Cereri din mai multe tabele
(JOIN-uri)
10.05.2013
Limbajul SQL
7. Cereri din mai multe tabele (JOIN-uri)
7.1. JOIN-urile proprietatea ORACLE
7.1.1. Cartesian Product
7.1.2. Equijoin
7.1.3. Non-equijoin
7.1.4. Outer join
7.1.5. Self join
10.05.2013
10.05.2013
Join-uri
SQL 1999
Cross join
Natural join
Using clause
Full (two sided) outer
joins
Arbitrary join conditions
for outer joins
10.05.2013
Limbajul SQL
7. Cereri din mai multe tabele (JOIN-uri)
7.1. JOIN-urile proprietatea ORACLE
7.1.1. Cartesian Product
7.1.2. Equijoin
7.1.3. Non-equijoin
7.1.4. Outer join
7.1.5. Self join
10.05.2013
10.05.2013
10.05.2013
10.05.2013
10
Limbajul SQL
7. Cereri din mai multe tabele (JOIN-uri)
7.1. JOIN-urile proprietatea ORACLE
7.1.1. Cartesian Product
7.1.2. Equijoin
7.1.3. Non-equijoin
7.1.4. Outer join
7.1.5. Self join
10.05.2013
11
Equijoin
EQUIJOIN
Uneori denumit simple join sau inner join, un
equijoin este o legtur ntre tabele care combin linii
ce au valori echivalente pentru coloanele specificate.
Exemplu:
SELECT angajati.angajati_id, angajati.nume,
angajati.nr_dept, departamente.nr_dept,
departamente.id_locatie
FROM angajati, departamente
WHERE angajati.nr_dept = departamente.nr_dept
10.05.2013
12
Equijoin
Cheie
strin
(Foreign
key)
Cheie
primar
(Primary
key)
10.05.2013
Equijoin
FOLOSIREA
OPERATORULUI AND
Ca i la interogrile
care folosesc o singur
tabel, se poate folosi
operatorul AND pentru a
restriciona liniile
selectate.
13
10.05.2013
14
Equijoin
ALIAS-URI
Atunci cnd denumirile coloanelor i tabelelor
sunt mari, devine incomod de lucrat cu acestea.
Pentru a scurta denumirile respective, se
folosesc alias-urile.
Se pot folosi alias-uri att pentru coloane ct i
pentru tabele.
Dac este precizat un alias pentru o tabel n
clauza FROM, atunci alias-ul respectiv trebuie s
nlocuiasc numele tabelei n clauza SELECT.
10.05.2013
Equijoin
Exemplu:
SELECT a.id_angajat, a.nume, a.id_dept,
d.id_dept, d.locatie
FROM angajati a, departamente d
WHERE a.id_dept = d.id_dept;
15
10.05.2013
16
Equijoin
1) Realizai un produs cartezian care afieaz
coloanele tabelelor d_play_list i d_track_listings
din baza de date DJ.
SELECT d.id_concert, d.id_cantec, d.comentarii,
t.numar_cd, t.track
FROM d_play_list d, d_track_listings t;
Lipseste clauza
WHERE
10.05.2013
17
Equijoin
2) Scriei o interogare pentru a extrage informaii
din trei tabele ale bazei de date DJ: d_clients,
d_evenimente si d_job.
SELECT c.nume, e.nume, j.job_date
FROM d_clients c , d_evenimente e , d_job j
WHERE c.client_number = e.client_number AND
e.id = j.event_id;
(Solutia nu este unica.)
10.05.2013
18
Limbajul SQL
7. Cereri din mai multe tabele (JOIN-uri)
7.1. JOIN-urile proprietatea ORACLE
7.1.1. Cartesian Product
7.1.2. Equijoin
7.1.3. Non-equijoin
7.1.4. Outer join
7.1.5. Self join
10.05.2013
19
NONEQUIJOINS
Este posibil s dorim s extragem date dintr-o
tabel ce nu are coloan corespondent n cealalt
tabel (exemplu cnd datele se nregistreaz ca
domenii de valori).
n aceast situaie se folosete nonequijoin-ul.
n acest tip de join, deoarece nu exist o
potrivire exact ntre 2 coloane din fiecare tabel,
nu se folosete operatorul de egalitate.
Se pot folosi operatorii:
10.05.2013
NONEQUIJOINS
20
10.05.2013
NONEQUIJOINS
Exemplu:
SELECT a.nume, a.salariu, g.nivel
FROM angajati a, grade_salarizare g
WHERE a.salariu BETWEEN
g.sal_min AND g.sal_max
21
10.05.2013
22
Limbajul SQL
7. Cereri din mai multe tabele (JOIN-uri)
7.1. JOIN-urile proprietatea ORACLE
7.1.1. Cartesian Product
7.1.2. Equijoin
7.1.3. Non-equijoin
7.1.4. Outer join
7.1.5. Self join
10.05.2013
23
Outer Joins
Join-urile studiate pn n acest moment
au avut ca rezultat linii care:
1. fie au avut o valoare care s corespund n
ambele tabele
2. fie o valoare ntr-o tabel se regsea n
intervalul dintre 2 valori ale celeilalte tabele
Liniile care nu ndeplineau condiiile nu
erau selectate.
10.05.2013
24
Outer Joins
Uneori, dorim s extragem toate datele
dintr-o tabel, chiar dac nu au valori care s
se potriveasc n cealalt tabel ( missing
data ).
Acest lucru se realizeaz folosind outer
join-ul.
Operatorul pentru outer join este semnul
plus pus ntre paranteze rotunde (+)
10.05.2013
25
Outer Joins
Un outer join este folosit pentru a
vizualiza toate liniile care au valoare
corespondent n cealalt tabel i liniile
dintr-o tabel care nu au valoare
corespondent n cealalt tabel.
Pentru a indica tabela deficitar (care
poate avea date lips missing data),
se pune operatorul (+) dup numele
coloanei din tabel, n clauza WHERE.
10.05.2013
26
Outer Joins
OBSERVAIE:
Un outer join nu poate folosi operatorul IN i nu
poate fi legat la alt condiie prin operatorul OR.
10.05.2013
Outer Joins
Nu exist angajai in
departamentele 3,4 i 5
27
10.05.2013
Outer Joins
SELECT a.id_angajat, a.nume, d.id_dept
FROM angajati a, departamente d
WHERE a.id_dept(+) = d.id_dept;
28
10.05.2013
29
Outer Joins
APLICAII:
1) Creai o interogare care are ca rezultat afiarea
numelui
(nume)
i
id-ul
i
numele
departamentului pentru angajai. Includei toi
angajaii, chiar dac nu sunt asignai unui
departament.
2) Modificai interogarea din problema anterioar
pentru a afia toate id-urile departamentelor,
chiar dac nu au angajai asociai lor.
10.05.2013
30
Outer Joins
1) Creai o interogare care are ca rezultat afiarea numelui
(nume) i id-ul i numele departamentului pentru angajai.
Includei toi angajaii, chiar dac nu sunt asignai unui
departament.
10.05.2013
31
Outer Joins
2) Modificai interogarea din problema anterioar pentru a afia
toate id-urile departamentelor, chiar dac nu au angajai
asociai lor.
10.05.2013
32
Limbajul SQL
7. Cereri din mai multe tabele (JOIN-uri)
7.1. JOIN-urile proprietatea ORACLE
7.1.1. Cartesian Product
7.1.2. Equijoin
7.1.3. Non-equijoin
7.1.4. Outer join
7.1.5. Self join
10.05.2013
33
Self Joins
n modelarea de date, uneori este necesar s
10.05.2013
34
Self Joins
Pentru a face join de la o tabel la ea
aparen 2 tabele.
10.05.2013
Self Joins
35
10.05.2013
36
Self Joins
Exemplu:
SELECT lucrator.nume || lucreaza pentru ||
manager.nume
FROM angajati lucrator, angajati manager
WHERE lucrator.id_manager=manager.id_angajat;
10.05.2013
37
Self Joins
APLICAII
10.05.2013
38
Self Joins
1) Afiai numele i numrul pentru fiecare angajat
mpreun cu numele i numrul managerului.
Denumii coloanele: Angajat, Ang#, Manager i Mgr#.
SELECT
a.nume
AS "Angajat",
a.id_angajat
AS "Ang#",
m.nume
AS "Manager",
m.id_angajat
AS "Mgr#"
FROM angajati a, angajati m
WHERE a.id_angajat = m.id_angajat;
10.05.2013
39
Self Joins
2) Modificai interogarea 1 pentru a afia toi angajaii i
managerii lor chiar dac un angajat nu are un manager.
Ordonai lista obinut alfabetic, dup numele
angajailor.
SELECT a.nume
AS "Angajat",
a.id_angajat AS "Ang#",
m.nume
AS "Manager",
m.id_angajat AS "Mgr#"
FROM angajati a, angajati m
WHERE a.id_angajat = m.id_angajat(+)
ORDER BY a.nume;
10.05.2013
ntrebri?
40