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(*)
Считаем все строки, независимо от содержимого колонок:
Результат: 6
- Всего 6 гостей пришло.
- Неважно, принес ли кто-то подарок или нет, учитывается каждая строка.
COUNT(gift)
Считаем только те строки, где колонка gift не NULL:
Результат: 4
- Только Оля (Торт), Маша (Цветы), Петя (Торт), Оля (Торт) учитываются.
- Вася и Катя, у которых gift = NULL, не считаются.
- Эта разница показывает: сколько записей реально имеют данные по этой колонке.
COUNT(DISTINCT gift)
Считаем уникальные подарки:
Результат: 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):
Результат: 550
- Складываются только числа: 100 + 200 + 150 + 100 = 550
- NULL не учитываются
- Если бы все значения были NULL, результат был бы NULL, а не 0
2 SUM(DISTINCT amount)
Считаем сумму уникальных значений:
Результат: 450
- Уникальные значения amount: 100, 150, 200
- Складываем их: 100 + 150 + 200 = 450
- Показывает, сколько реально различных сумм встречается, игнорируя повторенияузнаем, сколько различных сумм клиенты реально платят.Это полезно, чтобы понять разнообразие корзин, например: есть ли клиенты, которые покупают одинаковые пакеты товаров.
🔍 Важные моменты
- NULL не участвуют — всегда нужно помнить, что SUM(column) не считает NULL.
- DISTINCT меняет результат — если в колонке повторяются значения, сумма с DISTINCT будет меньше обычной суммы.
- Суммирование строк с пропусками — может дать неожиданное ощущение «потери данных».
Вывод:
- SUM(column) = фактическая сумма всех чисел
- SUM(DISTINCT column) = сумма только уникальных чисел
- Важно учитывать NULL, иначе можно получить неожиданные результаты