Команда HAVING
Команда HAVING позволяет фильтровать
результат группировки, сделанной с помощью
команды GROUP BY.
Синтаксис
GROUP BY field HAVING condition
Таблицы для примеров
| id | name | age | salary |
|---|---|---|---|
| 1 | user1 | 23 | 400 |
| 2 | user2 | 25 | 500 |
| 3 | user3 | 23 | 500 |
| 4 | user4 | 30 | 900 |
| 5 | user5 | 27 | 500 |
| 6 | user6 | 28 | 900 |
Пример
Давайте продемонстрируем работу GROUP BY без условия HAVING при выборке из таблицы:
SELECT age, SUM(salary) AS sum FROM employees GROUP BY age
Результат выполнения кода:
| age | sum |
|---|---|
| 23 | 900 |
| 25 | 500 |
| 27 | 500 |
| 28 | 900 |
| 30 | 900 |
Пример
Давайте теперь с помощью условия HAVING оставим
только те строки, в которых суммарная зарплата
больше или равна 900:
SELECT age, SUM(salary) AS sum
FROM employees
GROUP BY age
HAVING SUM(salary) >= 900
Результат выполнения кода:
| age | sum |
|---|---|
| 23 | 900 |
| 28 | 900 |
| 30 | 900 |
Пример
Давайте с помощью функции COUNT
подсчитаем количество записей в группе, не используя HAVING:
SELECT age, COUNT(*) AS count FROM employees GROUP BY age
Результат выполнения кода:
| age | count |
|---|---|
| 23 | 2 |
| 25 | 1 |
| 27 | 1 |
| 28 | 1 |
| 30 | 1 |
Пример
А теперь давайте с помощью условия HAVING
оставим только те группы, в которых количество
строк меньше или равно двум:
SELECT age, COUNT(*) AS count
FROM employees
GROUP BY age
HAVING COUNT(*) <= 2
Результат выполнения кода:
| age | count |
|---|---|
| 23 | 2 |
| 25 | 1 |
| 27 | 1 |
| 28 | 1 |
| 30 | 1 |
Пример
Давайте достигнем аналогичного эффекта,
воспользовавшись командой IN:
SELECT age, COUNT(*) AS count
FROM employees
GROUP BY age
HAVING COUNT(*) IN (1, 2)
Пример
Можно также использовать команду BETWEEN:
SELECT age, COUNT(*) AS count
FROM employees
GROUP BY age
HAVING COUNT(*) BETWEEN 1 AND 2