Table of Contents

Laborator 05 - Metode de JOIN

Obiective

Materiale ajutătoare

Resurse BD

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:

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:

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)

SELECT [DISTINCT|ALL] [[TABLE|table_alias].]{COLUMN|expression} [column_alias]
FROM 
	[schema.]table1 [table1_alias], 
	[schema.]table2 [table2_alias]
[other clauses]
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

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]
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]
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

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.

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

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.

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]
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 Right 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.

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]
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 Full Outer Join (A Full 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.

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:

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

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.

Exerciții individuale

  1. Să se facă o listă cu:
    • Nume Angajat
    • Departament Angajat
    • Grad Angajat
    • Nume Sef
    • Departament Sef
    • Grad Sef

Sa se afiseze toate rezutlatele, chiar daca nu se gasesc legaturi de JOIN intre intregistrarile din diferitele tabele.