Отличия функций count(0), count(1) и count(*) в SQL

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Функция COUNT(*) возвращает количество всех строк в таблице, включая те, которые содержат значения NULL. В то время как COUNT(1) или COUNT(0) дают одинаковые результаты, учитывая каждую строку, независимо от ее содержимого.

Отметим, что большинство SQL-оптимизаторов рассматривают эти функции как взаимозаменяемые.

Пример стандартного запроса для подсчета всех строк:

SQL
Скопировать код
SELECT COUNT(*) FROM table_name;  -- "Привет, таблица, как тебе сегодня живется?"

Ключевой вопрос здесь − использовать ли звездочку или нет. для четкого и однозначного выражения намерений оптимальнее применять COUNT(*).

Кинга Идем в IT: пошаговый план для смены профессии

Глубокое погружение: что скрывает 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 может влиять на блокировки и параллельную обработку. Важно учесть уровни изоляции транзакций и механизмы блокировок.

Полезные материалы

  1. Count(*) vs Count(1) – SQL Server – Stack Overflow — Обсуждение различий и производительности функций COUNT() на форуме Stack Overflow.
  2. MySQL :: MySQL 8.0 Reference Manual :: 5.3.4.8 Counting Rows — Описание функций COUNT() в официальной документации MySQL.
  3. COUNT – MariaDB Knowledge Base — Описание функции COUNT() в MariaDB, соответствующее положениям MySQL.
  4. Ask TOMЭкспертные рекомендации от проекта Ask TOM о применении COUNT() в Oracle и связанных вопросах производительности.
  5. COUNT (Transact-SQL) – SQL Server | Microsoft Learn — Раздел Microsoft по Transact-SQL, рассматривающий COUNT().
  6. Reddit – Dive into anything — Обсуждения и замечания из практики в сообществах по сравнению COUNT(*) и COUNT(1).