MySQL Java JavaScript PHP Python HTML-CSS C-sharp

Outer Join

În subiectul anterior, am discutat despre Inner Join sau unirea internă a tabelelor. În MySQL, putem utiliza și ceea ce se numește unire externă sau Outer Join. Spre deosebire de Inner Join, unirea externă returnează toate rândurile uneia sau a ambelor tabele implicate în unire.

Outer Join are următorul sintaxă formală:

SELECT coloane
FROM tabelul1
   {LEFT|RIGHT} [OUTER] JOIN tabelul2 ON conditie1
   [{LEFT|RIGHT} [OUTER] JOIN tabelul3 ON conditie2]...

Înaintea operatorului JOIN se specifică una dintre cuvintele cheie LEFT sau RIGHT, care definesc tipul de unire:

  • LEFT: selecția va include toate rândurile din prima sau stânga tabelă
  • RIGHT: selecția va include toate rândurile din a doua sau dreapta tabelă

De asemenea, înaintea operatorului JOIN poate să apară cuvântul cheie OUTER, dar utilizarea sa nu este obligatorie. Apoi, după JOIN, este specificat tabelul care urmează să fie alăturat, iar apoi urmează condiția de unire.

De exemplu, să unim tabelele Orders și Customers:

SELECT FirstName, CreatedAt, ProductCount, Price, ProductId
FROM Orders LEFT JOIN Customers
ON Orders.CustomerId = Customers.Id

Tabela Orders este prima sau stânga tabelă, iar tabela Customers este a doua sau dreapta tabelă. Prin urmare, deoarece se utilizează o selecție pe baza primei tabele, inițial toate rândurile vor fi selectate din Orders, iar apoi, conform condiției Orders.CustomerId = Customers.Id, vor fi adăugate rândurile asociate din Customers.

Dupa rezultatul prezentat mai sus, poate părea ca o îmbinare la stânga este similară cu INNER JOIN, dar nu este așa. Inner Join unește rândurile din ambele tabele atunci când condiția este îndeplinită.

Dacă una dintre tabele conține rânduri care nu îndeplinesc această condiție, aceste rânduri nu sunt incluse în rezultatul final.

Left Join selectează toate rândurile din prima tabelă și apoi le adaugă pe cele din a doua tabelă. De exemplu, luăm tabela Customers și adăugăm informații despre comenzile lor:

#INNER JOIN
SELECT FirstName, CreatedAt, ProductCount, Price
FROM Customers JOIN Orders
ON Orders.CustomerId = Customers.Id;

#LEFT JOIN
SELECT FirstName, CreatedAt, ProductCount, Price
FROM Customers LEFT JOIN Orders
ON Orders.CustomerId = Customers.Id;

În cazul unui LEFT JOIN în MySQL, se selectează inițial toți clienții din tabela Customers, apoi li se asociază comenzile din tabela Orders prin condiția Orders.CustomerId = Customers.Id.

Cu toate acestea, nu toți clienții au comenzi. În acest caz, pentru clienții care nu au comenzi, valorile corespunzătoare coloanelor vor fi setate la NULL.

Schimbăm tipul de îmbinare în exemplul de mai sus de la LEFT JOIN la RIGHT JOIN:

SELECT FirstName, CreatedAt, ProductCount, Price
FROM Customers RIGHT JOIN Orders
ON Orders.CustomerId = Customers.Id;

În cazul unui RIGHT JOIN, MySQL selectează inițial toate comenzile din tabela Orders (tabela din dreapta) și apoi le asociază clienților din tabela Customers prin condiția Orders.CustomerId = Customers.Id.

În cazul în care unei comenzi nu i se potrivește niciun client, vor fi setate valori NULL pentru coloanele corespunzătoare clientului.

Utilizăm un LEFT JOIN pentru a adăuga informații despre utilizatori și produse la comenzile:

SELECT Customers.FirstName, Orders.CreatedAt,
      Products.ProductName, Products.Manufacturer
FROM Orders
LEFT JOIN Customers ON Orders.CustomerId = Customers.Id
LEFT JOIN Products ON Orders.ProductId = Products.Id;

Și de asemenea, puteți aplica condiții mai complexe cu filtrare și sortare. De exemplu, selectăm toate comenzile cu informații despre clienți și produse pentru acele produse cu prețul mai mare de 45000 și le sortăm după data comenzii:

SELECT Customers.FirstName, Orders.CreatedAt,
      Products.ProductName, Products.Manufacturer
FROM Orders
LEFT JOIN Customers ON Orders.CustomerId = Customers.Id
LEFT JOIN Products ON Orders.ProductId = Products.Id
WHERE Products.Price > 45000
ORDER BY Orders.CreatedAt;

Sau vom selecta toți utilizatorii din Customers care nu au comenzi în tabelul Orders:


SELECT FirstName FROM Customers
LEFT JOIN Orders ON Customers.Id = Orders.CustomerId
WHERE Orders.CustomerId IS NULL;

Se poate combina și Inner Join și Outer Join:

SELECT Customers.FirstName, Orders.CreatedAt,
      Products.ProductName, Products.Manufacturer
FROM Orders
JOIN Products ON Orders.ProductId = Products.Id AND Products.Price > 45000
LEFT JOIN Customers ON Orders.CustomerId = Customers.Id
ORDER BY Orders.CreatedAt;

La început, în baza condiției tabelului Orders, se atașează informații conexe din tabelul Products printr-un Inner Join, apoi, printr-un Outer Join, se adaugă informații din tabelul Customers.

← Lecția anterioară Lecția următoare →