Представьте себе... У вас есть длиннющий список покупок из супермаркета. Вы хотите подсчитать, сколько в итоге вы потратили денег. Не будете же вы складывать всё вручную, верно? А вот у продавцов всё уже в базе данных. Поэтому вы получаете результирующий чек с правильной суммой. Скорее всего, где-то в их приложении им помогает героиня нашей сегодняшней лекции — функция SUM()! Это агрегатная функция, которая позволяет складывать значения в колонке числового типа.
Синтаксис SUM()
Функция SUM() выглядит так же просто, как её название, но давайте разберём всё по частям:
SELECT SUM(столбец)
FROM таблица;
Функция берет все значения в указанном столбце и суммирует их. Но, скажем прямо: никакого магического сложения текстов или дат тут не будет! Только числа.
Примеры использования SUM()
Давайте начнем с простого примера. Мы будем работать с таблицей salaries, которая хранит зарплаты сотрудников:
| employee_id | salary |
|---|---|
| 1 | 50000 |
| 2 | 60000 |
| 3 | 55000 |
| 4 | 75000 |
Пример 1: Суммирование всех зарплат
Вы хотите узнать общий фонд заработной платы компании. Вот как это сделать:
SELECT SUM(salary) AS total_salary
FROM salaries;
Результат:
| total_salary |
|---|
| 240000 |
Что тут произошло? PostgreSQL сложил все значения из столбца salary (50000 + 60000 + 55000 + 75000) и вернул результат в новом столбце с названием total_salary.
Пример 2: Суммирование с условием
Допустим, вы хотите узнать общую зарплату только сотрудников, которые получают больше 55,000. Вспомним наш любимый оператор WHERE:
SELECT SUM(salary) AS high_salary_total
FROM salaries
WHERE salary > 55000;
Результат:
| high_salary_total |
|---|
| 135000 |
Что произошло здесь? Сначала PostgreSQL применил фильтр WHERE salary > 55000, оставив только строки с зарплатами 60000 и 75000. Затем он сложил эти две зарплаты (60000 + 75000).
3. Особенности работы SUM()
Как NULL влияет на SUM()? Как мы уже видели, NULL — это "ничто", и SUM() не включает его в расчеты. Рассмотрим таблицу:
| employee_id | salary |
|---|---|
| 1 | 50000 |
| 2 | 60000 |
| 3 | NULL |
| 4 | 75000 |
Если мы захотим узнать общий фонд зарплат:
SELECT SUM(salary) AS total_salary
FROM salaries;
Результат:
| total_salary |
|---|
| 185000 |
Почему "185000", а не "NULL"? PostgreSQL просто игнорирует NULL при расчете суммы.
Примеры сложных запросов с SUM()
Пример 1: Суммирование и фильтрация в одном запросе
Представьте таблицу sales, которая хранит данные о продажах. Вот её структура:
| product_id | amount |
|---|---|
| 1 | 150 |
| 2 | 200 |
| 3 | NULL |
| 1 | 100 |
Вы хотите узнать общую сумму продаж amount только для первого продукта product_id = 1:
SELECT SUM(amount) AS total_sales
FROM sales
WHERE product_id = 1;
Результат:
| total_sales |
|---|
| 150 |
Пример 2: Сумма и дополнительные вычисления
Снова работаем с таблицей salaries. Вы хотите узнать, насколько фонд зарплат превышает 200,000:
SELECT SUM(salary) - 200000 AS surplus
FROM salaries;
Результат:
| surplus |
|---|
| 40000 |
Типичные ошибки при использовании SUM()
Использование SUM() для нечисловых данных: если вы случайно попытаетесь суммировать, скажем, текстовые значения, то получите ошибку. Будьте аккуратны и проверяйте типы данных в вашем столбце.
Игнорирование NULL: часто новички забывают про NULL и считают, что он участвует в расчетах. Это может привести к неожиданным результатам.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ