Sunteți pe pagina 1din 7

Baze de Date

Lucrare laborator 5

Obiective
Consultarea datelor din mai multe tabele
Tipuri de joncţiuni
Arhitectura schemei HR

1. Consultarea datelor din mai multe tabele. Tipuri de joncţiuni


Conceptul care stă la baza extragerii datelor din mai multe tabele este joncţiunea lor
(”join” – ul) în vederea obţinerii unui rezultat unic (sub forma unui singur tabel). Oracle poate
realiza joncţiuni folosind fie sintaxa proprie, fie standardul SQL:1999.
Când se solicită date din mai multe tabele este necesară specificarea condiţiei (condiţiilor)
de joncţiune în clauza WHERE a frazei SELECT. Atunci când clauza WHERE lipseşte sau
condiţiile sunt invalide, se obţine produsul cartezian al mulţimilor înregistrărilor tabelelor
(toate liniile dintr-un tabel sunt adăugate tuturor liniilor din al doilea tabel pentru a obţine
tabelul final).
Numele coloanei trebuie prefixat de numele tabelei în situaţiile când acelaşi nume de
coloană apare în mai multe tabele.
Pentru a realiza joncţiunea a n tabele sunt necesare minim n-1 condiţii de joncţiune.

1.1. Echijonctiunea
Echijoncţiunea (equijoin, simple join sau inner join) este o legătură între tabele care
combină linii ce au valori echivalente pentru coloanele specificate.

Sintaxa ORACLE

SELECT tabela1.coloana1, tabela2.coloana2


FROM tabela1, tabela2
WHERE tabela1.coloana = tabela2.coloana; -- condiția de joncțiune

Sintaxa SQL:1999

SELECT tabela1.coloana1, tabela2.coloana2


FROM tabela1 NATURAL JOIN tabela2
-- Condiția de joncțiune nu mai este necesara

Daca mai multe coloane au aceleaşi nume, dar tipurile datelor nu corespund, se
poate modifica clauza NATURAL JOIN prin folosirea clauzei USING pentru a
specifica coloanele care vor fi utilizate pentru echi-join.
Baze de Date

Se utilizează clauza USING, pentru a pune în corespondenta doar o coloana, în situaţia în


care pot sa corespunda mai multe coloane din cele doua tabele legate.
Clauzele NATURAL JOIN şi USING se exclud mutual.

Exemplu:
Să presupunem ca se doreşte ca rezultat un tabel cu 3 coloane: numele, prenumele angajaţilor
şi numele departamentului. Cele trei coloane nu provin din acelaşi tabel din baza de date
(first_name şi last_name aparţin tabelei EMPLOYEES, iar department_name tabelei
DEPARTMENTS):

SELECT first_name, last_name, department_name


FROM employees, departments
WHERE employees.department_id = departments.department_id;
-- conditie de join

Aliasuri de tabele

Alias-ul unui tabel este definit în clauza FROM, imediat după numele tabelului. Prin utilizarea
aliasurilor de tabele se simplifica interogările diminuându-se dimensiunea codului şi se
îmbunătăţesc performantele. În principiu un alias poate avea pana la 30 de caractere, dar este
indicat sa nu se ajungă la un număr atât de mare. Atunci când se defineşte un alias pentru
tabel este obligatorie folosirea lui în locul numelui tabelului în clauza SELECT.

Exemple:
1.Să se afişeze un tabel cu 3 coloane: numele, prenumele angajaţilor şi numele
departamentului.

SELECT first_name, last_name, department_name


FROM employees e, departments d
-- e este alias pentru employees
-- d este alias pentru departments
WHERE e.department_id = d.department_id; -- conditie de join

2.Să se afişeze un tabel cu 4 coloane: numele, prenumele angajaţilor, numele departamentului


şi oraşul.

SELECT e.first_name, e.last_name, d.department_name, l.city


FROM employees e, departments d, locations l
WHERE e.department_id = d.department_id AND d.location_id =
l.location_id;

Ca şi la interogările care folosesc o singură tabelă, se poate folosi operatorul AND pentru a
restricţiona liniile selectate sau clauza GROUP BY pentru a grupa datele.
Baze de Date

Exemple:
1.Să se afişeze numele, prenumele angajaţilor şi numele departamentului, pentru angajaţii cu
id-ul mai mic decât 200.

SELECT e.first_name, e.last_name, d.department_name


FROM employees e, departments d
-- e este alias pentru employees,
-- d este alias pentru departments
WHERE e.department_id = d.department_id AND employee_id<200;

2.Să se afişeze numele departamentelor şi numărul de angajaţi din fiecare departament.

SELECT department_name, COUNT(employee_id)


FROM employees e, departments d
WHERE e.department_id = d.department_id -- conditie de join
GROUP BY department_name;

3.Să se afişeze numele, numărul şi numărul de angajaţi pentru fiecare departament.

SELECT department_name, e.department_id, COUNT(employee_id)


FROM employees e, departments d
WHERE e.department_id = d.department_id -- conditie de join
GROUP BY department_name, e.department_id;

1.2. Theta-jonctiunea (non echijonctiune)

Acest tip de joncţiune este utilizat atunci când nu există o potrivire exactă între coloanele
specificate. O non-echijonctiune conţine, în condiţia de legătura specificata, alţi operatori
decât "=", cum ar fi: <=; =>; BETWEEN.

Sintaxa ORACLE

SELECT tabela1.coloana1, tabela2.coloana2


FROM tabela1, tabela2
WHERE tabela1.coloana [> | < | >= | <= | BETWEEN] tabela2.coloana;

Exemple:

SELECT e.first_name, e.last_name, j.job_title, e.salary


FROM employees e, jobs j
WHERE salary BETWEEN j.min_salary AND j.max_salary;
Baze de Date

SELECT e.first_name, e.last_name, j.job_title, e.salary


FROM employees e, jobs j
WHERE e.salary > j.min_salary;

1.3. Jonctiunea externa (outer join)


Joncţiunea externă este utilizată când se doreşte extragerea tuturor datelor dintr-o tabelă,
chiar dacă nu are valori care să se potrivească în cealaltă tabelă. Pentru a indica tabela
deficitară (care poate avea date lipsă – “missing data”), se utilizează operatorul (+) după
numele coloanei din tabelă, în clauza WHERE.
Sintaxa ORACLE se întâlneşte sub una din următoarele forme:

 joncţiune externa stânga - LEFT OUTER JOIN


SELECT tabela1.coloana,tabela2.coloana
FROM tabela1, tabela2
WHERE tabela1.coloana (+) = tabela2.coloana;

 joncţiune externa dreapta - RIGHT OUTER JOIN


SELECT tabela1.coloana,tabela2.coloana
FROM tabela1, tabela2
WHERE tabela1.coloana = tabela2.coloana (+);

Exemple:

 joncţiune externa stânga - LEFT OUTER JOIN


SELECT e.first_name, e.last_name, d.department_name
FROM employees e, departments d
WHERE d.department_id (+) = e.department_id;

 joncţiune externa dreapta - RIGHT OUTER JOIN


SELECT e.first_name, e.last_name, d.department_name
FROM employees e, departments d
WHERE d.department_id = e.department_id(+);

Observaţii:
1. Operatorul pentru joncţiunea externa (+) poate sa apară numai intr-o parte a expresiei - în
partea din care lipseşte informaţia.
2. O condiţie care implica o joncţiune externa, nu poate utiliza operatorul "IN" , sau nu poate
fi legată de o altă condiţie prin operatorul "OR"
Baze de Date

1.4. Auto-jonctiunea (self join)


Sunt situaţii în care este necesar ca un tabel sa intre în asociere cu el însuşi.

Exemplu: Se doreşte găsirea tuturor persoanelor care au fost angajate în firmă la o dată
ulterioara datei la care a fost angajată persoana 'Irene Mikkilineni'.
În acest caz, tabelul Employees va fi accesat de doua ori: prima oara pentru a găsi
înregistrarea corespunzătoare pentru e.first_name = 'Irene' AND e.last_name = 'Mikkilineni',
cu toate valorile corespunzătoare ale câmpurilor (inclusiv hire_date = hire_date1), după care
se vor determina acele înregistrări ale căror valori în câmpul hire_date sunt superioare valorii
hire_date1.

SELECT e1.first_name, e1.last_name, e1.hire_date


FROM Employees e, Employees e1
WHERE e.first_name = 'Irene' AND e.last_name =
'Mikkilineni' and e.hire_date < e1.hire_date;

2. Arhitectura schemei HR

Definiţie 1. O cheie primara (primary key - PK) este o cheie candidata careia proiectantul îi
confera un rol special de accesare si identificare a tuplurilor relatiei. În plus, se impune ca
atributelor cheii primare sa nu admita valori de NULL sa nu fie modificate prin operatii de
actualizare a datelor.
Definiţie 2. O cheie straina (foreign key - FK) este o multime de atribute FK ale unei relatiei
R1 care refera relatia R2 si satisface urmatoarele conditii:
a) atributele cheii straine FK sunt definite pe domenii compatibile cu cele ale atributelor
unei cheii candidate CK a relatiei R2 si
b) combinatia de valori ale atributelor FK într-un tuplu din relatia R1, fie este identica cu
combinatia de valori ale atributelor CK a unui tuplu oarecare din starea curenta a
relatiei R2, fie ia valoarea NULL.
Cheia straina realizeaza asocierea N:1 între relatiile R1 si R2 (ceea ce este echivalent cu
asocierea 1:N între relatiile R2 si R1) si reprezinta o constrângere între doua relatii, numita
constrângere referentiala . Relatia care contine cheia straina se numeste relatia care refera (R1
în definitia de mai sus), iar relatia care contine cheia candidata se numeste relatia referita (R2
în definitia de mai sus).
Joncţiunile pot conţine una sau mai multe tabele între care există asocieri (1:N, N:M). Pentru
a facilita căutarea informaţiilor, schema din figura următoare prezintă asocierile între tabelele
schemei HR.
Baze de Date

Exerciţii
1. Afişaţi numele, numărul şi numele job-ului pentru toti angajaţii.
2. Afişaţi numele, numărul şi numele job-ului pentru toti angajaţii cu job-ul
Programmer.
3. Afişaţi numele angajaţilor, numele departamentului în care lucrează şi numele job-
ului.
4. Scrieti o cerere care sa intoarca numele, numarul şi numele departamentului şi job-ul
tuturor celor care lucreaza în Seattle.
5. Afişaţi toate locaţiile (oraşul şi ţara) din Europa.
6. Afişaţi numele departamentelor din Canada.
7. Afişaţi numele departamentelor, numărul de angajaţi şi salariul mediu pentru fiecare
departament.
8. Gasiti care sunt numele acelor departamente în care salariul maxim este mai mare
dacat 10000.
9. Afisati numarul de tari care sunt inregistrate pentru fiecare regiune.
10. Afisati numele job-urilor, salariul mediu pentru fiecare si nr de angajati pentru job-
urile de vanzari (Sales).
11. Scrieţi o interogare care afişează numele şi job-ul angajaţilor care lucrează în acelaşi
departament cu angajatul cu numele Luis Popp.
12. Scrieti o interogare care sa afiseze numele şi identificatorii angajatilor precum şi
numele şi identificatorul managerului caruia ii este subordonat fiecare. Etichetati
coloanele astfel: "Angajat"," Marca_ang"," Manager", " Marca_man". Salvati
interogarea intr-un script.
Baze de Date

13. Gasiti numele şi salariul fiecarui angajat care este subordonat managerului cu
numele King.
14. Creaţi o interogare care are ca rezultat afişarea locaţiei (id şi oraş) şi a numelui
departamentelor. Includeţi toate locaţiile, chiar dacă nu există niciun departament
corespunzător.
15. Creaţi o interogare care afişează numele ţărilor şi oraşelor. Includeţi toate ţările, chiar
dacă nu există niciun oraş corespunzător în tabelul locations.

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