Отличия функций 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)
.