Отличия count(column) и count(*) в SQL: подсчет NULL значений
Быстрый ответ
Метод COUNT(column)
в SQL подсчитывает только те записи, для которых значения в указанном столбце не являются NULL, в отличие от COUNT(*)
, который подсчитывает все строки, не обращая внимания на NULL и дубликаты.
SELECT COUNT(column_name) FROM table_name; -- Исключает строки с NULL в указанной колонке.
SELECT COUNT(*) FROM table_name; -- Учитывает все строки, вне зависимости от наличия NULL.
COUNT(*)
учтет каждую строку независимо от их содержимого, в то время как COUNT(column)
пропустит строки, в которых выбранная колонка содержит NULL.
Точность против универсальности: сделайте осознанный выбор
Для точных подсчетов используйте 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:
SELECT COUNT(email), COUNT(*) FROM users;
COUNT(email)
подсчитает кол-во пользователей с указанными адресами электронной почты, в отличие от COUNT(*)
, который подсчитает всех пользователей, не зависимо от наличия адреса электронной почты.
Интерпретация результатов: берегите себя от ошибок
Замена COUNT(column_name)
на COUNT(*)
в запросах, связанных с дубликатами или специфическими фильтрами, может привести к некорректным результатам.
Нюансы использования функции Count
Подсчёт с пустыми данными
При подсчёте в пустом наборе данных NULL ведёт себя аналогично пустоте:
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)
:
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(*)
подсчитает все заказы, независимо от наличия позиций.
Полезные материалы
- SQL COUNT(), AVG() and SUM() Functions — Особенности работы агрегатных функций в SQL.
- SQL: COUNT Function — Анализ функции COUNT() в SQL-запросах.
- PostgreSQL: Documentation: 16: 9.21. Aggregate Functions — Разбор работы с агрегатными функциями и NULL в PostgreSQL.
- COUNT(*) vs COUNT(ALL) – Differences in SQL — Сравнение
COUNT(*)
иCOUNT(ALL)
в SQL. - MySQL :: MySQL 8.0 Reference Manual :: 3.3.4.8 Counting Rows — Возможности ускорения
COUNT(*)
в MySQL согласно официальной документации.