This is an old revision of the document!


Laborator 05 - Metode de JOIN

Obiective

  • Cross Join
  • Inner Join
    • Equi Join
    • Natural Join
    • Theta Join
  • Left Outer Join
  • Right Outer Join
  • Full Outer Join
  • Vertical Join

Materiale ajutătoare

Noțiuni teoretice

SQL Join este o instrucțiune care combină date din mai multe tabele. Fiecare comandă SELECT poate folosi una sau mai multe metode de JOIN. Standardul ANSI-SQL definește 5 tipuri de JOIN:

  • INNER
  • LEFT OUTER JOIN
  • RIGHT OUTER JOIN
  • FULL OUTER JOIN
  • CROSS JOIN

Un caz special este SELF JOIN care face JOIN pe o tabelă cu ea însăși.

Image source: http://kirillpavlov.com/blog/2016/04/23/beyond-traditional-join-with-apache-spark/

JOIN

Sintaxa pentru JOIN simplu este următoarea:

  • DISTINCT – returnează doar o înregistrare în cazul în care comanda găsește liniile duplicate;
  • ALL – returnează toate înregistrările simple și duplicate;
  • schema – reprezintă schema de identificare a tabelei (view-ului);
  • column_alias – este un nume alocat unei coloane(expresii) care va fi folosit în formatarea coloanei (numele care apare în antetul listei);
  • WHERE condition – reprezintă o clauză (înlănțuire de condiții) care trebuie să fie îndeplinită în criteriul de selecție a înregistrărilor;
  • ORDER BY {expresion|position} [ASC|DESC] – ordonează înregistrările selectate după coloanele din expresie sau în ordinea coloanelor (selecterate în clauza SELECT) specificate prin poziție.
SELECT [DISTINCT|ALL] [[TABLE|table_alias].]{COLUMN|expression} [column_alias]
FROM 
	[schema.]table1 [table1_alias], 
	[schema.]table2 [table2_alias]
WHERE 
	{table1|table1_alias.}COLUMN = {tabel2|table2_alias}.COLUMN
[ORDER BY {expresion|POSITION} [ASC|DESC]]

CROSS JOIN (Produsul Cartezian)

  • Produsul cartezian (Cross Join) a două tabele se obține prin concatenarea fiecărei linii dintr-o tabelă cu fiecare linie din cealaltă tabelă;
  • Rezultatul este un număr de linii egal cu produsul cartezian dintre numărul de linii din fiecare tabela din cluaza FROM. Această situație este mai puțin practică și se întâlnește, de regulă, când sunt puse greșit condițiile.
  • Sintaxa CROSS JOIN este:
SELECT [DISTINCT|ALL] [[TABLE|table_alias].]{COLUMN|expression} [column_alias]
FROM 
	[schema.]table1 [table1_alias], 
	[schema.]table2 [table2_alias]
[other clauses]
  • Alta sintaxa CROSS JOIN (recomandată pentru lucru cu toate bazele de date relaționale):
SELECT [DISTINCT|ALL] [[TABLE|table_alias].]{COLUMN|expression} [column_alias]
FROM 
	[schema.]table1 [table1_alias] CROSS JOIN
	[schema.]table2 [table2_alias]
[other clauses]

Ex. 1 Să se facă un Cross Join pe tabele angajati si departamente pentru angajații care au funcția ANALYST. Să se selecteze numele angajatului, funcția acestuia și numele departamentului.

INNER JOIN

  • INNER JOIN este cel mai folosit tip de Join;
  • Este o operație care poate fi folosită cu siguranță într-o bază de date care impune integritatea referințelor sau în cazul în care câmpurile din constrângere nu sunt NULL;
  • Inner Join are următoarele subtipuri:
    • Equi-join
    • Natural join
    • Non Equi-join (Θ-Join)
Equi-join
  • Dacă în condițiile de Join apar numai egalități, avem de-a face cu un EQUI-JOIN;
  • Pentru a putea să realizăm un join pe mai multe coloane, este obligatoriu ca ele să conțină coloane de același tip cu date comune sau corelate;
  • Folosiți aliasuri pentru tabele pentru a nu apărea ambiguități în momentul în care se referă coloanele pentru Sintaxa 1 și Sintaxa 2.
  • Sintaxa 1 pentru Equi-Join :
SELECT [DISTINCT|ALL] {{TABLE|table_alias}.}{COLUMN|expression} [column_alias]
FROM 
	[schema.]table1 [table1_alias], 
	[schema.]table2 [table2_alias]
WHERE
	 {{table1|table1_alias}.}column_fromTable1 = {{table2|table2_alias}.}column_fromTable2
[other clauses]
  • Sintaxa 2 pentru Equi-Join (recomandată de ultimul standart SQL ):
SELECT [DISTINCT|ALL] {{TABLE|table_alias}.}{COLUMN|expression} [column_alias]
FROM 
	[schema.]table1 [table1_alias] 
		[INNER] JOIN [schema.]table2 [table2_alias]
		ON   	{{table1|table1_alias}.}column_fromTable1 = 		{{table2|table2_alias}.}column_fromTable2
[other clauses]
  • Sintaxa 3 pentru Equi-Join (această sintaxă merge doar în Oracle):
SELECT [DISTINCT|ALL] {{TABLE|table_alias}.}{COLUMN|expression} [column_alias]
FROM 
	[schema.]table1 [table1_alias] 
		[INNER] JOIN [schema.]table2 [table2_alias]
		USING(COLUMN)
	[other clauses]

Ex. 2. Să se selecteze id-ul departamentului, numele departamentului, numele și funcția pentru toți angajații care lucrează în departmanentul 10.

Natural Join
  • Operația de join NATURAL JOIN este un tip de Equi-Join.
  • Pentru acest tip de Join nu trebuie să se mai specifice condițiile de legătură, operația de egalitatea se face implicit pe toate coloanele care au același nume in cele două tabele.
  • Rezultatul concatenării celor două tabele va afișa numai o coloană din perechea pe care formează condiția de egalitate.

Dacă folosiți Natural Join NU asociați aliasuri coloanelor care intră în componența condiției. Apare următoarea eroare: ORA-25155: column used in NATURAL join cannot have qualifier.

  • Sintaxa pentru NATURAL JOIN este următoarea:
SELECT [DISTINCT|ALL] [[TABLE|table_alias].]{COLUMN|expression} [column_alias]
FROM 
	[schema.]table1 [table1_alias] 
		NATURAL JOIN [schema.]table2 [table2_alias]
[other clauses]

Ex. 3. Să se rezolve exercițiul 2 folosind Natural Join.

Non Equi-join (Θ-Join)

Ex. 4. Să se listeze numele, salariul și gradul de salarizare pentru angajații din departamentul 20. Când una sau mai multe tabele care nu au coloane comune, sau operatorul folosit nu este egal și trebuie să corelăm tabelele, avem un NON EQUI-JOIN.

Ex. 5. Să se listeze numele, salariul, gradul de salarizare și numele departamentului pentru angajații din departamentul 20.

Self Join

În situația în care este nevoie să extragem date corelate din același tabel, se folosește SELF JOIN. Sintaxa este aceeași ca la Inner Join.

Ex. 6. Să se listeze numele, funcția, numele șefului și funcția sefului pentru angajații din departamentul 10.

Outer Join

  • Folosind Inner Join se selectează doar înregistrările care îndeplinesc condițiile din clauza WHERE.
  • Apar situații când cererea trebuie să selecteze și înregistrările care nu îndeplinesc toate condițiile din clauză, în aceste cazuri se folosește OUTER JOIN (Join Extern).
  • Outer Join are următoarele subtipuri:
    • Left Outer Join
    • Right Outer Join
    • Full Outer Join
Left Outer Join

Fie două tabele A și B. Operația de Left Outer Join (A Left Outer Join B) returnează toate înregistrările din tabela A și, în cazul în care nu găsește o corespondență în tabela B va întoarce NULL, altfel va întoarce valorile selectate din tabela B.

  • Sintaxa Left Outer Join (merge doar în Oracle ) este următoarea:
SELECT [DISTINCT|ALL] {{TABLE|table_alias}.}{COLUMN|expression} [column_alias]
FROM 
	[schema.]table1 [table1_alias], 
	[schema.]table2 [table2_alias]
WHERE
	 {{table1|table1_alias}.}column_fromTable1 = {{table2|table2_alias}.}column_fromTable2 (+)
[other clauses]
  • Sintaxa Left Outer Join (recomandată de ultimul standard SQL, merge în toate SGBD-urile) este:
SELECT [DISTINCT|ALL] {{TABLE|table_alias}.}{COLUMN|expression} [column_alias]
FROM 
	[schema.]table1 [table1_alias] 
		LEFT OUTER JOIN [schema.]table2 [table2_alias]
		ON   	{{table1|table1_alias}.}column_fromTable1 = 		{{table2|table2_alias}.}column_fromTable2
[other clauses]

Ex. 7. Să se selecteze toate departamentele și angajații care fac parte din fiecare departament. Să se ordoneze crescător după id-ul departamentului.

Right Outer Join

Fie două tabele A și B. Operația de Left Outer Join (A Right Outer Join B) returnează toate înregistrările din tabela B și, în cazul în care nu găsește o corespondență în tabela A va întoarce NULL, altfel va întoarce valorile selectate din tabela A.

  • Sintaxa Right Outer Join (merge doar în Oracle):
SELECT [DISTINCT|ALL] {{TABLE|table_alias}.}{COLUMN|expression} [column_alias]
FROM 
	[schema.]table1 [table1_alias], 
	[schema.]table2 [table2_alias]
WHERE
	 {{table1|table1_alias}.}column_fromTable1(+) = {{table2|table2_alias}.}column_fromTable2
[other clauses]
  • Sintaxa Right Outer Join (recomandată de ultimul standard SQL, merge în toate SGBD-urile) este:
SELECT [DISTINCT|ALL] {{TABLE|table_alias}.}{COLUMN|expression} [column_alias]
FROM 
	[schema.]table1 [table1_alias] 
		RIGHT OUTER JOIN [schema.]table2 [table2_alias]
		ON   	{{table1|table1_alias}.}column_fromTable1 = 		{{table2|table2_alias}.}column_fromTable2
[other clauses]
Full Outer Join

Fie două tabele A și B. Operația de Left Outer Join (A Right Outer Join B) returnează toate înregistrările din tabela A și B și, în cazul în care nu găsește o corespondență în tabela A sau B va întoarce NULL, altfel va întoarce valorile selectate din tabela A sau B.

  • Sintaxa Full Outer Join (recomandată de ultimul standard SQL, merge în toate SGBD-urile) este:
SELECT [DISTINCT|ALL]
{{TABLE|table_alias}.}{COLUMN|expression} [column_alias]
FROM
[schema.]table1 [table1_alias]
FULL [OUTER] JOIN [schema.]table2 [table2_alias]
ON
{{table1|table1_alias}.}column_fromTable1 =
{{table2|table2_alias}.}column_fromTable2
[other clauses]

Ex. 9. Să se afișeze numele, funcția, salariul si gradul de salarizare pentru toți angajații , după ce se li se dublează salariul.

Observații:

  • Totdeauna semnul (+) se pune în dreptul tabelei deficitare de informație;
  • Left Outer Join este invers simetrica cu Right Outer Join, adică, pentru tabelele A și B, A left outer join B = B right outer join A;
  • Pentru a corela datele se pot folosi toți operatorii comparație și de negație, atât logici cât și SQL;
  • Se pot combina operațiile de Join între ele.

Ex. 10. Să se selecteze numele de departament, numele, salariu si gradul de salariu pentru angajații din firmă, după ce salariile se dublează. Să se afișeze și numele departamentelor care nu au angajați și gradele care nu corespund niciunui salariu dublat.

Join Vertical

  • Join-ul vertical este folosit pentru concatenarea rezultatelor mai multor comenzi SELECT și folosește operatorii UNION [ALL] (reuniune), INTERSECT (intersecția), MINUS (diferența);
  • În acest caz se face Join după coloane de același tip, din acest motiv se numește Join Vertical;
  • Coloanele selectate trebuie să fie de același tip (data type) când se folosesc operatorii UNION [ALL], INTERSECT, MINUS, chiar dacă au semnificații diferite;
  • Folosind operatorul UNION ALL se selectează și înregistrările duplicate;
  • Operatorul INTERSECT se folosește pentru a selecta înregistrările comune;
  • Operatorul MINUS se folosește pentru a selecta doar înregistrările care nu se regăsesc în al doilea select.

Ex. 11. Să se listeze angajații din departamentele 10 și 30.

Ex. 12. Să se construiască o cerere care reunește pe aceeași coloană salariile angajațiilor din departamentul 10 și comisionale celor din departamentul 30.

Ex. 13. Să se selecteze toate funcțiile din departamentul 10 și 20.

Ex. 14. Să se selecteze funcțiile care au primit același comision și se regăsesc în departamentele 10, 20,30.

Ex. 15. Să se selecteze funcțiile care se găsesc în departamentul 10 dar nu se regăsesc în departamentul 30.

bd/laboratoare/05.1552936051.txt.gz · Last modified: 2019/03/18 21:07 by iulia.radulescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0