LEFT JOIN în MySQL

Legarea tabelelor (JOIN) Toate versiunile MySQL și MariaDB

Leagă două tabele și păstrează toate rândurile din primul, chiar dacă nu au pereche în al doilea.

Sintaxă
SELECT ... FROM tabel1 LEFT JOIN tabel2 ON conditie;

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 au NULL acolo și dispar, iar LEFT JOIN devine un INNER JOIN. Mută condiția în ON: ON o.client_id = c.id AND o.total > 100.
  • Folosești COUNT(*) în loc de COUNT(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ă.