Aggregate Functions & Grouping

HAVING Clause: Functions

-- Basic HAVING SELECT department, COUNT(*) AS employee_count FROM employees GROUP BY department HAVING COUNT(*) > 10; -- WHERE + GROUP BY + HAVING SELECT depar

-- Basic HAVING

SELECT

department,

COUNT(*) AS employee_count

FROM employees

GROUP BY department

HAVING COUNT(*) > 10;

-- WHERE + GROUP BY + HAVING

SELECT

department,

AVG(salary) AS avg_salary

FROM employees

WHERE hire_date >= '2020-01-01'

GROUP BY department

HAVING AVG(salary) > 60000;

-- Multiple HAVING conditions

SELECT

department,

COUNT(*) AS count,

AVG(salary) AS avg_salary

FROM employees

GROUP BY department

HAVING COUNT(*) > 5

AND AVG(salary) > 50000;

HAVING filters groups after GROUP BY

HAVING can use aggregate functions

WHERE filters rows before GROUP BY

WHERE cannot use aggregate functions

HAVING requires GROUP BY (usually)

Multiple conditions with AND/OR

Core references in this topic include GROUP BY, HAVING, COUNT. Learn what each one does, when to use it, and the execution or engine rules that matter.

GROUP BY

Collects rows into groups so aggregate functions can compute one result per group.

GROUP BY department_id

HAVING

Filters groups after aggregation has been computed.

HAVING COUNT(*) > 5

COUNT

Counts rows or non-NULL values depending on the argument.

COUNT(*)