Documente Academic
Documente Profesional
Documente Cultură
În SQL, JOIN-urile sunt utilizate pentru a combina înregistrări din două sau mai multe tabele,
bazându-se pe o condiție comună.
Ele permit extragerea de date din mai multe tabele într-o singură interogare și sunt esențiale în
gestionarea bazelor de date relaționale.
MySQL 8 suportă diferite tipuri de JOIN-uri, cum ar fi INNER JOIN, LEFT JOIN, RIGHT JOIN
și FULL JOIN.
https://dev.mysql.com/doc/refman/8.0/en/join.html
1
1. SELF JOIN este un join obisnuit in care tabela se uneste cu ea insasi
Self join în MySQL 8 este utilizat atunci când dorim să combinăm înregistrări din aceeași tabelă, creând o
relație între înregistrările din aceeași entitate. Self join poate fi util atunci când avem o structură
ierarhică sau relații între înregistrări în cadrul aceleiași tabele.
FROM employees e
În acest exemplu, tabela "employees" este folosită de două ori într-un self join.
Prima mențiune a tabelei "employees" este denumită "e" și reprezintă angajații.
A doua mențiune a tabelei "employees" este denumită "m" și reprezintă managerii.
Prin utilizarea clauzei JOIN și a expresiei "e.emp_no = m.emp_no", stabilim relația între
angajați și manageri în baza de date.
În clauza WHERE, verificăm că numărul de angajat al angajatului există în tabela
"dept_manager", asigurându-ne că angajatul are un manager asociat.
Rezultatul final va conține o listă de angajați împreună cu numele managerilor lor.
Alt exemplu:
FROM employees e
2
Exemplu de cod pentru a obține numele angajaților și numele departamentelor în care lucrează:
Sau
3. Left Join (sau Left Outer Join): Returnează toate înregistrările din tabela din stânga
(prima specificată în clauza JOIN), împreună cu înregistrările corespunzătoare din tabela
din dreapta (a doua specificată), dacă există o potrivire.
Dacă nu există o potrivire, se vor afișa NULL în coloanele din tabela din dreapta.
Se folosește atunci când dorim să obținem toate înregistrările din tabela din stânga și doar
înregistrările corespunzătoare din tabela din dreapta.
Exemplu de cod pentru a obține numele și salariul angajaților, inclusiv cei care nu au salarii:
3
SELECT e.first_name, e.last_name, s.salary
FROM employees e
LEFT JOIN salaries s ON e.emp_no = s.emp_no;
Exemplu de cod pentru a obține numele angajaților și numele departamentelor în care lucrează,
inclusiv angajații care nu sunt atribuiți unui departament:
4. Right Join (sau Right Outer Join): Returnează toate înregistrările din tabela din dreapta (a
doua specificată în clauza JOIN), împreună cu înregistrările corespunzătoare din tabela
din stânga (prima specificată), dacă există o potrivire.
Dacă nu există o potrivire, se vor afișa NULL în coloanele din tabela din stânga.
Se folosește mai puțin frecvent decât Left Join, dar este util atunci când dorim să obținem
toate înregistrările din tabela din dreapta și doar înregistrările corespunzătoare din tabela din
stânga.
Exemplu de cod pentru a obține numele departamentelor și numele angajaților care lucrează în
fiecare departament, inclusiv departamentele fără angajați:
5. Full Join (sau Full Outer Join): Returnează toate înregistrările din ambele tabele,
împreună cu înregistrările care nu au corespondențe în cealaltă tabelă.
4
Se folosește atunci când dorim să obținem toate înregistrările din ambele tabele, inclusiv
înregistrările care nu au corespondențe.
Exemplu de cod pentru a obține numele angajaților și numele departamentelor în care lucrează,
afișând toate înregistrările din ambele tabele:
6. Cross Join (sau Cartesian Join): Returnează toate combinațiile posibile dintre
înregistrările din ambele tabele, rezultând un produs cartezian al acestora. Nu necesită o
condiție de potrivire și poate genera un număr mare de înregistrări. Se folosește rar și în
situații specifice.
5
înregistrare din tabela "departments". Este important de menționat că această interogare poate
genera un număr mare de înregistrări, în funcție de câte angajați și departamente există în
baza de date.
Exemplul de cod pentru fiecare tip de join utilizând baza de date "employees" este:
Inner Join:
Left Join:
Right Join:
Full Join:
Cross Join:
6
JOIN, where si order by
FROM employees e
În acest exemplu, clauza WHERE este adăugată după clauza JOIN pentru a aplica un filtru
suplimentar. Astfel, rezultatul final va conține doar angajate de gen feminin (unde condiția
e.gender = 'F' este îndeplinită). Apoi, clauza ORDER BY este utilizată pentru a sorta rezultatele în
ordine crescătoare a câmpului "first_name" al tabelului "employees".
UNION
UNION în MySQL 8 este un operator care este utilizat pentru a combina rezultatele a două sau
mai multe interogări, rezultând un set de rezultate distincte.
Acesta combină rezultatele orizontale, adică adaugă rândurile rezultatelor unei interogări la
sfârșitul rândurilor rezultatelor celeilalte interogări.
https://dev.mysql.com/doc/refman/8.0/en/union.html
Utilizarea UNION: UNION este folosit atunci când dorim să combinăm rezultatele mai multor
interogări care au aceeași structură de coloane. Adică, rezultatele trebuie să aibă același număr
de coloane și tipurile de date ale acestor coloane trebuie să fie compatibile.
7
O caracteristică importantă a UNION este că elimină automat înregistrările duplicate din setul
de rezultate final. Dacă interogările individuale returnează înregistrări care se suprapun,
rezultatul final va conține doar o singură apariție a acestor înregistrări. Dacă dorim să păstrăm
înregistrările duplicate, putem folosi operatorul UNION ALL în loc de UNION.
Diferența dintre UNION și join-uri: Principalul punct de diferență dintre UNION și join-uri este că
UNION combină rezultatele interogărilor într-un set distinct de rezultate, în timp ce join-uri
combină înregistrări din tabele diferite, pe baza unei condiții, pentru a obține înregistrări
8
rezultante mai complexe. UNION este utilizat pentru a combina rezultatele, în timp ce join-urile
sunt utilizate pentru a combina înregistrările.
În concluzie, UNION este utilizat pentru a combina rezultatele interogărilor distincte într-un set
de rezultate distincte, eliminând duplicatelor. Este important să înțelegem diferența între
UNION și join-uri, deoarece acestea sunt două concepte diferite utilizate în contexte diferite
pentru a obține rezultate specifice.
FROM employees
UNION
9
FROM dept_manager dm
FROM employees
UNION
FROM employees
În acest exemplu, am eliminat aliasurile pentru coloanele "name" și "role" și am folosit direct
numele coloanelor "first_name" și "role" în interogare. Restul codului și funcționalitatea rămân
aceleași ca în exemplul anterior.
Rezultatul final va conține o listă combinată a angajaților și managerilor din baza de date
"employees", cu coloanele "emp_no" pentru numărul angajatului, "first_name" pentru nume și
o coloană suplimentară pentru a indica rolul fiecărei persoane.
10
Folosim union si alias explicit pentru coloana
FROM employees
UNION
FROM dept_manager dm
Prima interogare rămâne neschimbată și selectează angajații cu numere de angajat mai mici de
1000.
A doua interogare este modificată pentru a utiliza tabela "dept_manager" pentru a obține
numărul de angajat și a se alătura tabela "employees" pentru a obține numele complet al
managerilor.
Rezultatul final va conține o listă combinată a angajaților și managerilor din baza de date
"employees", cu coloanele "emp_no" pentru numărul angajatului, "name" pentru nume și
"role" pentru a indica rolul fiecărei persoane.
11
MySQL UNION și ORDER BY
Dacă doriți să sortați setul de rezultate al unei uniuni, utilizați o ORDER BY clauză în
ultimul SELECT
FROM employees
UNION
FROM employees
FROM employees
UNION
FROM employees
12
13