GROUP BY în MySQL

Grupare și calcule Toate versiunile MySQL și MariaDB

Grupează rândurile cu aceeași valoare, ca să calculezi totaluri pentru fiecare grup.

Sintaxă
SELECT coloana, COUNT(*) FROM tabel GROUP BY coloana;

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 SELECT o coloană care nu este în GROUP BY. Primești eroarea isn't in GROUP BY (ONLY_FULL_GROUP_BY).
  • Filtrezi după un total de grup cu WHERE: WHERE COUNT(*) > 1 dă eroare. Folosește HAVING.

Comenzi înrudite

  • HAVING: Filtrează grupurile după GROUP BY, de exemplu doar clienții cu mai mult de o comandă.
  • COUNT: Numără rândurile sau valorile dintr-o coloană.
  • SUM: Adună valorile dintr-o coloană numerică.