Короткий ответ
COUNT(*) считает строки независимо от их содержимого. COUNT(column_name) игнорирует строки, в которых выбранный столбец равен NULL.
Как это работает подробнее
Большинство агрегатных функций не учитывает NULL. Для COUNT(column_name) это означает подсчёт только известных значений, тогда как звёздочка обозначает саму строку.
COUNT(DISTINCT column_name) делает ещё один шаг: исключает NULL и считает количество различных ненулевых значений.
Пример кода
query.sql
SELECT
COUNT(*) AS total_rows,
COUNT(email) AS rows_with_email,
COUNT(*) - COUNT(email) AS rows_without_email
FROM customers;Что использовать на практике
- Полнота данных. Сравните общее число строк с числом заполненных email; разность покажет пропуски.
- После LEFT JOIN. Для числа связанных записей считайте ненулевой ключ правой таблицы, а не
COUNT(*).
Подводные камни
- Нулевое значение. Число
0и пустая строка учитываются; исключается толькоNULL. - Дубликаты. Обычный
COUNT(column_name)не устраняет повторяющиеся значения.