Count (*) vs count (column-name) - что является более правильным?

Разве это имеет значение, если вы делаете count(*) vs count(column-name), как в этих двух примерах?

У меня есть тенденция всегда писать count(*), потому что, похоже, он лучше подходит мне в голову, поскольку это понятие является совокупной функцией, если это имеет смысл.

Но я не уверен, насколько это технически лучше, поскольку я чаще вижу код примера, написанный без *.

Количество (*):

select customerid, count(*), sum(price) 
from items_ordered
group by customerid
having count(*) > 1;

против. кол-(имя-столбца):

SELECT customerid, count(customerid), sum(price)
FROM items_ordered
GROUP BY customerid
HAVING count(customerid) > 1;

Ответ 1

  • COUNT(*) подсчитывает все строки
  • COUNT(column) подсчитывает только числа, отличные от NULL
  • COUNT(1) совпадает с COUNT(*), потому что 1 - это ненулевые выражения

Использование COUNT(*) или COUNT(column) должно основываться только на желаемом выходе.

Ответ 2

Это относится к MySQL. Я не уверен в других.

Разница заключается в следующем:

  • COUNT(*) будет подсчитывать количество записей.
  • COUNT(column_name) будет подсчитывать количество записей, где column_name не равно null.

Поэтому COUNT(*) - это то, что вы должны использовать. Если вы используете MyISAM и нет предложения WHERE, тогда оптимизатору даже не нужно смотреть на таблицу, так как количество строк уже кэшировано.

Ответ 3

Когда это идентификатор (и гарантированно не NULL), то это, вероятно, не имеет значения.

Однако существует разница между COUNT(*) и COUNT(column) в общем случае тем, что COUNT(column) вернет счетчик значений не NULL в столбце. Существует также вариант COUNT(DISTINCT column), который возвращает количество уникальных значений NULL.

Ответ 4

Да, есть возможная разница в производительности. В зависимости от вашего запроса и индексации рассматриваемой таблицы быстрее получить счетчик из индекса вместо перехода к таблице для данных. Таким образом, вы, вероятно, должны указать имя поля, а не использовать *.

Ответ 5

Как правило, это то же самое, но в деталях AFAIK "count (*)" лучше b/c "count (columnname)" заставляет БД выполнять немного больше кода для поиска этого имени столбца ( но не обязательно, хотя).