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/
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]]
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.
|
|
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.
|
|
|
|
|
|
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.
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.
Î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.
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.
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]
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.
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.
Sa se afiseze toate rezutlatele, chiar daca nu se gasesc legaturi de JOIN intre intregistrarile din diferitele tabele.