← Назад к вопросам

Можно ли использовать агрегирующую функцию без 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();

Важные моменты

  1. Без GROUP BY возвращается ОДНА строка результата
  2. Агрегирующая функция работает с целым набором данных
  3. Нельзя использовать неагрегирующие поля без GROUP BY:
SELECT department_id, COUNT(*)
FROM employees;
-- Ошибка!
  1. Агрегирующие функции обрабатывают NULL как отсутствующее значение:
SELECT COUNT(*) FROM employees;          -- Включая NULL
SELECT COUNT(commission) FROM employees;  -- Исключая NULL

Агрегирующие функции без GROUP BY полезны для получения общей статистики по таблице и часто используются в аналитических запросах и отчётах.