Ce face LEFT JOIN
LEFT JOIN păstrează toate rândurile din tabelul din stânga (cel de după FROM). Unde nu există pereche în tabelul din dreapta, coloanele lui sunt NULL.
Așa găsești, de exemplu, clienții care nu au comandat niciodată: faci LEFT JOIN cu comenzile și păstrezi rândurile unde comanda este NULL. Există și RIGHT JOIN, care păstrează rândurile din dreapta, dar se folosește rar.
Exemple
Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.
CREATE TABLE clienti (
id INT PRIMARY KEY,
nume VARCHAR(50) NOT NULL,
oras VARCHAR(30),
email VARCHAR(100)
);
INSERT INTO clienti VALUES
(1, 'Ana Pop', 'Cluj', 'ana@exemplu.ro'),
(2, 'Bogdan Ionescu', 'Sibiu', NULL),
(3, 'Cristina Marin', 'Cluj', 'cristina@exemplu.ro'),
(4, 'Dan Stoica', 'Arad', NULL);
CREATE TABLE comenzi (
id INT PRIMARY KEY,
client_id INT,
data DATE,
total INT
);
INSERT INTO comenzi VALUES
(101, 1, '2026-09-03', 3580),
(102, 3, '2026-09-15', 650),
(103, 1, '2026-10-02', 1200),
(104, 2, '2026-10-11', 80);
Exemplul 1: Toți clienții, cu sau fără comenzi
SELECT c.nume, o.id AS comanda, o.total
FROM clienti AS c
LEFT JOIN comenzi AS o ON o.client_id = c.id
ORDER BY c.nume, o.id;
Rezultat
+----------------+---------+-------+
| nume | comanda | total |
+----------------+---------+-------+
| Ana Pop | 101 | 3580 |
| Ana Pop | 103 | 1200 |
| Bogdan Ionescu | 104 | 80 |
| Cristina Marin | 102 | 650 |
| Dan Stoica | NULL | NULL |
+----------------+---------+-------+
Exemplul 2: Clienții fără nicio comandă
SELECT c.nume
FROM clienti AS c
LEFT JOIN comenzi AS o ON o.client_id = c.id
WHERE o.id IS NULL;
Rezultat
+------------+
| nume |
+------------+
| Dan Stoica |
+------------+
Exemplul 3: Numărul de comenzi, inclusiv 0
SELECT c.nume, COUNT(o.id) AS comenzi
FROM clienti AS c
LEFT JOIN comenzi AS o ON o.client_id = c.id
GROUP BY c.id, c.nume
ORDER BY comenzi DESC, c.nume;
Rezultat
+----------------+---------+
| nume | comenzi |
+----------------+---------+
| Ana Pop | 2 |
| Bogdan Ionescu | 1 |
| Cristina Marin | 1 |
| Dan Stoica | 0 |
+----------------+---------+
Greșeli frecvente
- Pui o condiție pe tabelul din dreapta în
WHERE(WHERE o.total > 100). Rândurile fără pereche auNULLacolo și dispar, iarLEFT JOINdevine unINNER JOIN. Mută condiția înON:ON o.client_id = c.id AND o.total > 100. - Folosești
COUNT(*)în loc deCOUNT(o.id). Clienții fără comenzi apar cu 1 în loc de 0.
Comenzi înrudite
INNER JOIN: Combină rândurile din două tabele care au o valoare comună, de exemplu comenzile cu clienții lor.IS NULL: Găsește rândurile în care o coloană nu are valoare (NULL) sau, cu IS NOT NULL, în care are.COUNT: Numără rândurile sau valorile dintr-o coloană.