COUNT и SUM: как SQL считает
Когда мы слышим «COUNT» и «SUM» мы подразумеваем - «считает строки», «суммирует числа»
Но даже для таких действий есть тонкости и нюансы.
А пока подписывайся на мой канал На связи: SQL Там я публикую посты про особенности и нюансы SQL. Этот канал про то, как не бояться баз данных, понимать, что такое JOIN, GROUP BY и почему NULL ≠ 0. Его я веду с нуля подписчиков. Присоединяйся!
В большинстве случаев мы используем 3 вида COUNT
COUNT(*) — считает все строки, даже пустые.
COUNT(column) — считает только те строки, где есть данные.
COUNT(DISTINCT column) — считает уникальные значения в column.
Рассмотрим на конкретном примере:
| id | name | gift |
-------------------------------
| 1 | Оля | Торт |
| 2 | Вася | NULL |
| 3 | Маша | Цветы |
| 4 | Петя | Торт |
| 5 | Катя | NULL |
| 6 | Оля | Торт |
COUNT(*)
Считаем все строки, независимо от содержимого колонок:
SELECT COUNT(*) FROM guests;
Результат: 6
Всего 6 гостей пришло.
Неважно, принес ли кто-то подарок или нет, учитывается каждая строка.
COUNT(gift)
Считаем только те строки, где колонка gift не NULL:
SELECT COUNT(gift) FROM guests;
Результат: 4
Только Оля (Торт), Маша (Цветы), Петя (Торт), Оля (Торт) учитываются.
Вася и Катя, у которых gift = NULL, не считаются.
Эта разница показывает: сколько записей реально имеют данные по этой колонке.
COUNT(DISTINCT gift)
Считаем уникальные подарки:
SELECT COUNT(DISTINCT gift) FROM guests;
Результат: 2
Есть только два уникальных подарка: Торт и Цветы.
Независимо от того, сколько гостей принесли одинаковый подарок, каждый подарок считается один раз.
🔍 Что это говорит при анализе данных
COUNT(*) — общее количество записей (все строки).
COUNT(column) — сколько строк с заполненным значением в колонке.
COUNT(DISTINCT column) — сколько уникальных значений встречается в колонке.
Вывод: разница между этими числами может показать пропуски (NULL) и повторяющиеся данные. Это важно при анализе — если просто взять COUNT(*), можно недооценить проблему с пропущенными значениями.
Ну а теперь рассмотрим SUM
Чтобы показать, как эта функция работает и какие тонкости бывают, рассмотрим таблицу:
Таблица orders:
| id | customer | amount |
| -- | -------- | ------ |
| 1 | Оля | 100 |
| 2 | Вася | NULL |
| 3 | Маша | 200 |
| 4 | Петя | 150 |
| 5 | Катя | NULL |
| 6 | Оля | 100 |
1️⃣ SUM(amount)
Считаем сумму по колонке amount (игнорирует NULL):
SELECT SUM(amount) FROM orders;
Результат: 550
Складываются только числа: 100 + 200 + 150 + 100 = 550
NULL не учитываются
Если бы все значения были NULL, результат был бы NULL, а не 0
2️⃣ SUM(DISTINCT amount)
Считаем сумму уникальных значений:
SELECT SUM(DISTINCT amount) FROM orders;
Результат: 450
Уникальные значения amount: 100, 150, 200
Складываем их: 100 + 150 + 200 = 450
Показывает, сколько реально различных сумм встречается, игнорируя повторения
узнаем, сколько различных сумм клиенты реально платят.Это полезно, чтобы понять разнообразие корзин, например: есть ли клиенты, которые покупают одинаковые пакеты товаров.
🔍 Важные моменты
NULL не участвуют — всегда нужно помнить, что SUM(column) не считает NULL.
DISTINCT меняет результат — если в колонке повторяются значения, сумма с DISTINCT будет меньше обычной суммы.
Суммирование строк с пропусками — может дать неожиданное ощущение «потери данных».
Вывод:
SUM(column) = фактическая сумма всех чисел
SUM(DISTINCT column) = сумма только уникальных чисел
Важно учитывать NULL, иначе можно получить неожиданные результаты