Skip to content
Home Tutorials Roadmaps Courses
Log in Join free
Tutorials MySQL GROUP BY & HAVING
MySQL Intermediate FREE

GROUP BY & HAVING

Lesson 2 of 16 Intermediate Interactive

GROUP BY groups rows for per-group aggregation.

HAVING

Filters groups after aggregation. Can use aggregate functions.

Syntax

MYSQL
SELECT country, COUNT(*) AS user_count FROM users GROUP BY country;
SELECT country, COUNT(*) FROM users GROUP BY country HAVING COUNT(*) > 10;
SELECT department, AVG(salary) FROM employees
GROUP BY department HAVING AVG(salary) > 50000
ORDER BY AVG(salary) DESC;
GROUP BY and HAVING
SQL
-- Count users per city
SELECT city, COUNT(*) AS total
FROM users
GROUP BY city;

-- HAVING filters groups (WHERE filters rows)
SELECT city, AVG(age) AS avg_age
FROM users
GROUP BY city
HAVING AVG(age) > 25
ORDER BY avg_age DESC;

-- Group by with multiple columns
SELECT department, job_title, COUNT(*) AS staff
FROM employees
GROUP BY department, job_title
HAVING COUNT(*) > 2;

Practice

1
Exercise

Categories with more than 10 products.

Answer
SELECT category, COUNT(*) FROM products
GROUP BY category HAVING COUNT(*) > 10;

Quick Quiz

1

HAVING without GROUP BY?

Treats the entire result as one group.

Interview Questions

SELECT ? FROM ? WHERE ? GROUP BY ? HAVING ? ORDER BY ? LIMIT.