Отличия count(column) и count(*) в SQL: подсчет NULL значений

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

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

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

Метод COUNT(column) в SQL подсчитывает только те записи, для которых значения в указанном столбце не являются NULL, в отличие от COUNT(*), который подсчитывает все строки, не обращая внимания на NULL и дубликаты.

SQL
Скопировать код
SELECT COUNT(column_name) FROM table_name; -- Исключает строки с NULL в указанной колонке.
SELECT COUNT(*) FROM table_name; -- Учитывает все строки, вне зависимости от наличия NULL.

COUNT(*) учтет каждую строку независимо от их содержимого, в то время как COUNT(column) пропустит строки, в которых выбранная колонка содержит NULL.

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

Точность против универсальности: сделайте осознанный выбор

Для точных подсчетов используйте count(column)

Функция COUNT(column) подсчитывает только ненулевые значения в колонке, что актуально, когда нам важно:

  • Определить количество ненулевых значений: SELECT column_name FROM table WHERE COUNT(column_name) > 1.
  • Вычислить количество уникальных и не пустых записей: SELECT COUNT(DISTINCT column_name) FROM table.

Для общей статистики используйте count(*)

Функция COUNT(*) проходит по всем строкам таблицы, используя индексирование для увеличения скорости подсчета. Это полезно, когда требуется:

  • Определить общее количество записей в таблице.
  • Проверить полноту данных после их импорта.

Обработка данных с NULL-значениями

Если в таблице users столбец email может содержать NULL:

SQL
Скопировать код
SELECT COUNT(email), COUNT(*) FROM users;

COUNT(email) подсчитает кол-во пользователей с указанными адресами электронной почты, в отличие от COUNT(*), который подсчитает всех пользователей, не зависимо от наличия адреса электронной почты.

Интерпретация результатов: берегите себя от ошибок

Замена COUNT(column_name) на COUNT(*) в запросах, связанных с дубликатами или специфическими фильтрами, может привести к некорректным результатам.

Нюансы использования функции Count

Подсчёт с пустыми данными

При подсчёте в пустом наборе данных NULL ведёт себя аналогично пустоте:

SQL
Скопировать код
SELECT COUNT(column_name) FROM table_name WHERE 1 = 0; -- Вернет 0, нет данных.
SELECT COUNT(*) FROM table_name WHERE 1 = 0; -- Также вернет 0, данных нет.

Обе команды вернут 0 из-за фильтрации по условию WHERE, которое исключает любые резултаты.

Подсчёт с учётом изменений

В транзакционных базах данных во время подсчёта могут добавляться или удаляться строки. COUNT(*) будет отображать актуальное количество записей, в то время как COUNT(column) может не учесть строки, добавленные или удаленные в процессе.

Ускорение подсчета за счет индексации

Если нет подходящего индекса, то COUNT(column_name) может работать медленнее из-за необходимости полного сканирования таблицы, в отличие от COUNT(*), который использует индексы для ускорения подсчета.

Визуализация

Сравним COUNT(column) и COUNT(*) на примере яблони и яблок:

🌳(Дерево)   🍏(Яблоко)
---------------------
🌳             🍏
🌳    🍏
🌳             🍏
🌳    🍏
🌳

COUNT(*) подсчитает все деревья, включая те, которые не плодоносят:

Общее количество деревьев: 5 🌳🌳🌳🌳🌳

COUNT(Яблоко), в свою очередь, подсчитает только деревья с яблоками:

Плодоносящие деревья: 2 🌳🍏🌳🍏

Итог: COUNT(*) учитывает все деревья, тогда как COUNT(column) фокусируется только на плодоносящих деревьях.

Когда важны детали

Группировка и подсчёт

Сочетание GROUP BY и COUNT позволяет определить количество записей в каждой группе:

  • При использовании COUNT(column) группы, состоящие только из NULL, не будут учтены.
  • COUNT(*) предоставит точное количество записей в каждой группе.

Учёт ограничений

Столбцы с ограничением NOT NULL при использовании COUNT(column) и COUNT(*) возвращают одинаковые значения. В таких случаях выбор зависит от конкретной ситуации или предпочтений в стиле написания кода.

Статистика и соединения

LEFT JOIN ведет к наличию записей с NULL в результате, что искажает подсчет при использовании COUNT(column):

SQL
Скопировать код
SELECT COUNT(order_items.id), COUNT(*) 
FROM orders 
LEFT JOIN order_items ON orders.id = order_items.order_id; -- Работаем с выборкой от LEFT JOIN.

COUNT(order_items.id) подсчитывает только заказы с позициями, в то время как COUNT(*) подсчитает все заказы, независимо от наличия позиций.

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

  1. SQL COUNT(), AVG() and SUM() Functions — Особенности работы агрегатных функций в SQL.
  2. SQL: COUNT Function — Анализ функции COUNT() в SQL-запросах.
  3. PostgreSQL: Documentation: 16: 9.21. Aggregate Functions — Разбор работы с агрегатными функциями и NULL в PostgreSQL.
  4. COUNT(*) vs COUNT(ALL) – Differences in SQL — Сравнение COUNT(*) и COUNT(ALL) в SQL.
  5. MySQL :: MySQL 8.0 Reference Manual :: 3.3.4.8 Counting Rows — Возможности ускорения COUNT(*) в MySQL согласно официальной документации.