HAVING în MySQL

Grupare și calcule Toate versiunile MySQL și MariaDB

Filtrează grupurile după GROUP BY, de exemplu doar clienții cu mai mult de o comandă.

Sintaxă
SELECT ... GROUP BY coloana HAVING conditie;

Ce face HAVING

WHERE filtrează rândurile înainte de grupare, iar HAVING filtrează grupurile după grupare. De aceea, doar în HAVING poți folosi funcții de grup precum COUNT(*) sau SUM(total).

Le poți folosi pe amândouă în aceeași interogare: WHERE alege rândurile care intră în calcul, HAVING alege ce grupuri apar în rezultat.

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: Clienții cu mai multe comenzi

SELECT client_id, COUNT(*) AS comenzi
FROM comenzi
GROUP BY client_id
HAVING COUNT(*) > 1;

Rezultat

+-----------+---------+
| client_id | comenzi |
+-----------+---------+
|         1 |       2 |
+-----------+---------+

Exemplul 2: WHERE și HAVING împreună

Doar comenzile din septembrie intră în calcul, apoi sunt păstrați clienții cu un total de peste 1000 de lei.

SELECT client_id, SUM(total) AS total_septembrie
FROM comenzi
WHERE data BETWEEN '2026-09-01' AND '2026-09-30'
GROUP BY client_id
HAVING SUM(total) > 1000;

Rezultat

+-----------+------------------+
| client_id | total_septembrie |
+-----------+------------------+
|         1 |             3580 |
+-----------+------------------+

Greșeli frecvente

  • Pui în HAVING condiții care nu țin de grupuri (HAVING data > '2026-09-01'). Ele trebuie să stea în WHERE, unde sunt aplicate mai devreme și mai eficient.

Comenzi înrudite

  • GROUP BY: Grupează rândurile cu aceeași valoare, ca să calculezi totaluri pentru fiecare grup.
  • WHERE: Filtrează rândurile: păstrează doar rândurile care îndeplinesc o condiție.
  • COUNT: Numără rândurile sau valorile dintr-o coloană.