Отличия функций count(0), count(1) и count(*) в SQL
Быстрый ответ
Функция COUNT(*) возвращает количество всех строк в таблице, включая те, которые содержат значения NULL. В то время как COUNT(1) или COUNT(0) дают одинаковые результаты, учитывая каждую строку, независимо от ее содержимого.
Отметим, что большинство SQL-оптимизаторов рассматривают эти функции как взаимозаменяемые.
Пример стандартного запроса для подсчета всех строк:
SELECT COUNT(*) FROM table_name; -- "Привет, таблица, как тебе сегодня живется?"
Ключевой вопрос здесь − использовать ли звездочку или нет. для четкого и однозначного выражения намерений оптимальнее применять COUNT(*).

Глубокое погружение: что скрывает COUNT
Логика подсчета
Подробнее изучим особенности функции COUNT:
COUNT(*)обеспечивает абсолютную ясность. Эта функция считает каждую строку независимо от наличия в нейNULL-значений, что явно указывает на то, что подсчет включает все строки.COUNT(column)фокусируется на определенной колонке. Она подсчитывает только те строки, в которых указанная колонка содержит неNULL-значения. Если важно учитыватьNULL, то эта функция подходит для вас.COUNT(1)илиCOUNT(0)можно рассматривать как упрощенные варианты. Они считают все строки без исключения, не создавая значение.
Скорость работы COUNT
Вопрос скорости выполнения COUNT(1) относительно COUNT(*) актуален скорее в теории, т.к. современные SQL-оптимизаторы достаточно интеллектуалы, чтобы обрабатывать оба варианта с одинаковой скоростью. Мнение о том, что COUNT(1) работает быстрее, скорее всего, является пережитком прошлого.
Если вы хотите полностью разобраться в этом вопросе, можно провести эмпирические тесты производительности на своей системе.
Лучшие практики и совместимость
Хотя COUNT(*) остается наиболее понятным вариантом, использование COUNT(0) или COUNT(1) может быть уместно при работе с различными СУБД. В то же время с точки зрения читаемости лучше предпочитать ясность и избегать даже минимальной потенциальной оптимизации.
Визуализация
Представьте функцию COUNT как работу кассира в магазине:
Тип кассира | Метод подсчета покупателей | Аналогия ------------ | ------------------------ | ----------------- COUNT(*) | Учитываются все детали | 🧑💼🛒🔍✅ (Важны детали) COUNT(1) | Каждый человек считается как '1' | 🧑💼👏✅ (Счет ведется по людям, а не по покупкам) COUNT(0) | Тот же метод, что и COUNT(1) | 🧑💼👏✅ (Лишь под другим "названием")
Каждый кассир приходит к одному и тому же результату, но использует свой подход к подсчету.
SQL подсчет на практике
Осведомленность в области COUNT
Будьте готовы к неожиданностям, когда:
Используете сложные запросы с JOIN:
COUNT(*)может подсчитывать дубликаты строк, поэтому необходимо глубокое понимание данных и контекста задачи.Работаете с большими объемами данных: Целесообразно рассмотреть возможность сокращения обрабатываемого набора данных с помощью условий
WHEREили индексированных колонок.Применяете COUNT с DISTINCT: Для подсчета уникальных значений в колонке нужно использовать
COUNT(DISTINCT column). Это отличается отCOUNT(1)илиCOUNT(0).
Избежание распространенных ошибок
Некорректный подсчет из-за NULL: Для учета строк с
NULL-значениями применитеCOUNT(*), а неCOUNT(column).Чрезмерное увлечение COUNT: В некоторых случаях
EXISTSможет быть более эффективным, чем использованиеCOUNT. Если для вас достаточно знать о наличии хотя бы одной строки, рассмотрите этот вариант.Проблемы с блокировками: Выбор подходящей функции
COUNTможет влиять на блокировки и параллельную обработку. Важно учесть уровни изоляции транзакций и механизмы блокировок.
Полезные материалы
- Count(*) vs Count(1) – SQL Server – Stack Overflow — Обсуждение различий и производительности функций
COUNT()на форуме Stack Overflow. - MySQL :: MySQL 8.0 Reference Manual :: 5.3.4.8 Counting Rows — Описание функций
COUNT()в официальной документации MySQL. - COUNT – MariaDB Knowledge Base — Описание функции COUNT() в MariaDB, соответствующее положениям MySQL.
- Ask TOM — Экспертные рекомендации от проекта Ask TOM о применении
COUNT()в Oracle и связанных вопросах производительности. - COUNT (Transact-SQL) – SQL Server | Microsoft Learn — Раздел Microsoft по Transact-SQL, рассматривающий
COUNT(). - Reddit – Dive into anything — Обсуждения и замечания из практики в сообществах по сравнению
COUNT(*)иCOUNT(1).