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)" заставляет БД выполнять немного больше кода для поиска этого имени столбца ( но не обязательно, хотя).