Ce face GROUP BY
GROUP BY adună rândurile care au aceeași valoare într-o coloană într-un singur rând de rezultat. Funcțiile de grup (COUNT, SUM, AVG, MIN, MAX) se calculează apoi separat pentru fiecare grup.
Regula de bază: orice coloană din SELECT trebuie să fie fie în GROUP BY, fie într-o funcție de grup. MySQL 8 dă eroare dacă nu respecți regula.
GROUP BY nu ordonează rezultatul. Adaugă ORDER BY dacă ordinea contează.
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: Numărul și valoarea comenzilor pe client
SELECT client_id, COUNT(*) AS comenzi, SUM(total) AS valoare
FROM comenzi
GROUP BY client_id
ORDER BY valoare DESC;
Rezultat
+-----------+---------+---------+
| client_id | comenzi | valoare |
+-----------+---------+---------+
| 1 | 2 | 4780 |
| 3 | 1 | 650 |
| 2 | 1 | 80 |
+-----------+---------+---------+
Exemplul 2: Grupare după mai multe coloane
SELECT oras, email IS NOT NULL AS are_email, COUNT(*) AS clienti
FROM clienti
GROUP BY oras, are_email
ORDER BY oras, are_email;
Rezultat
+-------+-----------+---------+
| oras | are_email | clienti |
+-------+-----------+---------+
| Arad | 0 | 1 |
| Cluj | 1 | 2 |
| Sibiu | 0 | 1 |
+-------+-----------+---------+
Greșeli frecvente
- Pui în
SELECTo coloană care nu este înGROUP BY. Primești eroareaisn't in GROUP BY(ONLY_FULL_GROUP_BY). - Filtrezi după un total de grup cu
WHERE:WHERE COUNT(*) > 1dă eroare. FoloseșteHAVING.