← Назад к вопросам
Можно ли использовать агрегирующую функцию без GROUP BY?
2.0 Middle🔥 191 комментариев
#Базы данных и SQL
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Можно ли использовать агрегирующую функцию без GROUP BY?
Да, можно использовать агрегирующие функции без GROUP BY. В этом случае агрегирующая функция будет применена ко всему набору строк в таблице и вернёт одно значение.
Базовый пример
SELECT COUNT(*) FROM employees; -- Вернёт: 105
SELECT AVG(salary) FROM employees; -- Вернёт: 45000.50
SELECT MAX(hire_date) FROM employees; -- Вернёт: 2023-12-15
SELECT SUM(bonus) FROM employees; -- Вернёт: 520000
SELECT MIN(age) FROM employees; -- Вернёт: 22
С условием WHERE (без GROUP BY)
SELECT COUNT(*)
FROM employees
WHERE department_id = 5;
SELECT AVG(salary)
FROM employees
WHERE hire_date > "2020-01-01";
SELECT MAX(salary)
FROM employees
WHERE salary > 50000;
Сравнение: без GROUP BY vs с GROUP BY
Без GROUP BY (одна строка результата):
SELECT
COUNT(*) as total_employees,
AVG(salary) as avg_salary,
MAX(salary) as max_salary
FROM employees;
С GROUP BY (несколько строк результата):
SELECT
department_id,
COUNT(*) as total_employees,
AVG(salary) as avg_salary,
MAX(salary) as max_salary
FROM employees
GROUP BY department_id;
Все основные агрегирующие функции
SELECT COUNT(*) FROM employees; -- Все строки
SELECT COUNT(employee_id) FROM employees; -- Непустые значения
SELECT COUNT(DISTINCT department_id) FROM employees; -- Уникальные значения
SELECT SUM(salary) FROM employees;
SELECT AVG(salary) FROM employees;
SELECT MIN(salary), MAX(salary) FROM employees;
SELECT STRING_AGG(employee_name, ", ") FROM employees; -- PostgreSQL
SELECT GROUP_CONCAT(employee_name SEPARATOR ", ") FROM employees; -- MySQL
Практический пример: сводка по компании
SELECT
COUNT(*) as total_employees,
COUNT(DISTINCT department_id) as total_departments,
AVG(salary) as average_salary,
MIN(salary) as min_salary,
MAX(salary) as max_salary,
SUM(salary) as total_payroll,
MIN(hire_date) as first_hire,
MAX(hire_date) as last_hire
FROM employees;
Использование в Java с Hibernate/JPA
Long totalEmployees = (Long) session.createQuery(
"SELECT COUNT(e) FROM Employee e"
).uniqueResult();
Double avgSalary = (Double) session.createQuery(
"SELECT AVG(e.salary) FROM Employee e"
).uniqueResult();
Long maxSalary = (Long) session.createQuery(
"SELECT MAX(e.salary) FROM Employee e"
).uniqueResult();
Важные моменты
- Без GROUP BY возвращается ОДНА строка результата
- Агрегирующая функция работает с целым набором данных
- Нельзя использовать неагрегирующие поля без GROUP BY:
SELECT department_id, COUNT(*)
FROM employees;
-- Ошибка!
- Агрегирующие функции обрабатывают NULL как отсутствующее значение:
SELECT COUNT(*) FROM employees; -- Включая NULL
SELECT COUNT(commission) FROM employees; -- Исключая NULL
Агрегирующие функции без GROUP BY полезны для получения общей статистики по таблице и часто используются в аналитических запросах и отчётах.