Бесплатный вебинар
«как найти любимую работу»
Подарки на 150 000 ₽ за участие
Живой эфир
Записи не будет!
00:00:00:00
дн.ч.мин.сек.

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

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

Функция 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) можно рассматривать как упрощенные варианты. Они считают все строки без исключения, не создавая значение.

Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

Скорость работы 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).
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Что возвращает функция COUNT(*) в SQL?
1 / 5