У меня есть следующий запрос:
select column_name, count(column_name)
from table
group by column_name
having count(column_name) > 1;
Какая будет разница, если я заменю все звонки count(column_name)
на count(*)
?
Этот вопрос был вдохновлен тем, как найти повторяющиеся значения в таблице в Oracle? ,
Чтобы уточнить принятый ответ (и, возможно, мой вопрос), замена count(column_name)
на count(*)
вернула бы дополнительную строку в результате, которая содержит a null
и количество null
значений в столбце.
Другое незначительное различие между использованием * и конкретным столбцом заключается в том, что в случае столбца вы можете добавить ключевое слово DISTINCT и ограничить счет различными значениями:
источник
Еще одно и, возможно, едва заметное отличие состоит в том, что в некоторых реализациях базы данных число (*) вычисляется путем анализа индексов в рассматриваемой таблице, а не фактических строк данных. Поскольку конкретный столбец не указан, нет необходимости беспокоиться о фактических строках и их значениях (как было бы, если бы вы сосчитали определенный столбец). Разрешение базе данных использовать данные индекса может быть значительно быстрее, чем подсчет «реальных» строк.
источник
Объяснение в документации , помогает объяснить это:
Таким образом, count (*) включает нули, а другой метод - нет.
источник
Мы можем использовать Stack Exchange Data Explorer, чтобы проиллюстрировать разницу простым запросом. Таблица Users в базе данных Stack Overflow содержит столбцы, которые часто остаются пустыми, например URL-адрес веб-сайта пользователя.
Если вы запустите приведенный выше запрос в проводнике данных , вы увидите, что число одинаково для столбцов
count(Id)
иcount(*)
потому чтоId
они не допускаютnull
значений. ТемWebsiteUrl
не менее, количество намного ниже, потому что этот столбец позволяетnull
.источник
По сути,
COUNT(*)
функция возвращает все строки таблицы, тогда какCOUNT(COLUMN_NAME)
нет; то есть он исключает нулевые значения, на которые все здесь также ответили здесь. Но наиболее интересной частью является оптимизация запросов и базы данных, которые лучше использовать,COUNT(*)
если не выполнять многократные подсчеты или выполнять сложные запросыCOUNT(COLUMN_NAME)
. В противном случае это действительно снизит производительность вашей БД при работе с огромным количеством данных.источник
Пожалуйста, смотрите следующий код для выполнения тестов SQL Server 2008:
источник
COUNT(*)
- Возвращает общее количество записей в таблице (включая записи с нулевым значением).COUNT(Column Name)
- Возвращает общее количество записей, отличных от NULL. Это означает, что он игнорирует подсчет записей с нулевым значением в этом конкретном столбце.источник
Лучше всего использовать
чтобы подсчитать количество строк в таблице, это быстрее, чем любой формат, потому что он никогда не идет, чтобы проверить, существует ли имя столбца в таблице или нет
источник
COUNT(*)
по сравнению с нимCOUNT(columnName)
не пойдет проверять значение столбца, поскольку он просто перечисляет строки. НоCOUNT(columnName)
медленнее дажеcount
нанесенного наid
столб! По крайней мере, в SQL Server, конечно.Нет разницы, если один столбец является фиксированным в вашей таблице, если вы хотите использовать более одного столбца, чем вы должны указать, сколько столбцов вам нужно посчитать ......
Спасибо,
источник
Как упомянуто в предыдущих ответах,
Count(*)
подсчитывает дажеNULL
столбцы, тогда какcount(Columnname)
подсчитывает, только если столбец имеет значения.Это всегда лучше практика , чтобы избежать
*
(Select *
,count *
, ...)источник
COUNT(*)