В SQL, какая разница между count (column) и count (*)?

У меня есть следующий запрос:

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(*) приведет к возврату дополнительной строки в результате, который содержит столбцы null и count null.

Ответ 1

count(*) подсчитывает NULL и count(column) не

[edit] добавил этот код, чтобы люди могли его запускать

create table #bla(id int,id2 int)
insert #bla values(null,null)
insert #bla values(1,null)
insert #bla values(null,1)
insert #bla values(1,null)
insert #bla values(null,1)
insert #bla values(1,null)
insert #bla values(null,null)

select count(*),count(id),count(id2)
from #bla

Результаты 7 3 2

Ответ 2

Другим незначительным различием между использованием * и конкретным столбцом является то, что в случае столбца вы можете добавить ключевое слово DISTINCT и ограничить счет на различные значения:

select column_a, count(distinct column_b)
from table
group by column_a
having count(distinct column_b) > 1;

Ответ 3

Дальнейшее и, возможно, незначительное различие заключается в том, что в некоторых реализациях базы данных счетчик (*) вычисляется путем просмотра индексов в рассматриваемой таблице, а не фактических строк данных. Поскольку конкретный столбец не указан, нет необходимости беспокоиться о фактических строках и их значениях (как это было бы, если бы вы подсчитали конкретный столбец). Разрешение базы данных на использование данных индекса может быть значительно быстрее, чем подсчет "реальных" строк.

Ответ 4

Объяснение в docs помогает объяснить это:

COUNT (*) возвращает количество элементов в группе, включая значения NULL и дубликаты.

COUNT (выражение) оценивает выражение для каждой строки в группе и возвращает количество ненулевых значений.

Таким образом, count (*) содержит nulls, другой метод - нет.

Ответ 5

Мы можем использовать Stack Exchange Data Explorer, чтобы проиллюстрировать разницу с простым запросом. Таблица Users в базе данных Qaru содержит столбцы, которые часто остаются пустыми, например URL-адрес веб-сайта пользователя.

-- count(column_name) vs. count(*)
-- Illustrates the difference between counting a column
-- that can hold null values, a  'not null' column, and  count(*)

select count(WebsiteUrl), count(Id), count(*) from Users

Если вы запустили запрос выше в Проводнике данных, вы увидите, что счетчик будет таким же для count(Id) и count(*), потому что столбец Id не позволяет использовать значения null. Счетчик WebsiteUrl намного ниже, потому что этот столбец позволяет null.

Ответ 6

В основном функция COUNT (*) возвращает все строки из таблицы, тогда как COUNT (COLUMN_NAME) не работает; то есть он исключает нулевые значения, на которые здесь все также ответили. Но самая интересная часть состоит в том, чтобы оптимизировать запросы и базу данных, лучше использовать COUNT (*), если не использовать несколько счетчиков или сложный запрос, а не COUNT (COLUMN_NAME). В противном случае это существенно снизит производительность вашего БД при работе с огромным количеством данных.

Ответ 7

  • Предложение COUNT (*) указывает SQL Server, чтобы вернуть все строки из таблицы, включая NULL.
  • COUNT (имя_столбца) просто извлекает строки, имеющие ненулевое значение в строках.

См. следующий код для тестовых исполнений SQL Server 2008:

-- Variable table
DECLARE @Table TABLE
(
      CustomerId int NULL 
    , Name nvarchar(50) NULL
)

-- Insert some records for tests
INSERT INTO @Table VALUES( NULL, 'Pedro')
INSERT INTO @Table VALUES( 1, 'Juan')
INSERT INTO @Table VALUES( 2, 'Pablo')
INSERT INTO @Table VALUES( 3, 'Marcelo')
INSERT INTO @Table VALUES( NULL, 'Leonardo')
INSERT INTO @Table VALUES( 4, 'Ignacio')

-- Get all the collumns by indicating *
SELECT  COUNT(*) AS 'AllRowsCount'
FROM    @Table

-- Get only content columns ( exluce NULLs )
SELECT  COUNT(CustomerId) AS 'OnlyNotNullCounts'
FROM    @Table

Ответ 8

Лучше всего использовать

Count(1) in place of column name or * 

чтобы подсчитать количество строк в таблице, оно быстрее, чем любой формат, потому что он никогда не проверяет имя столбца в таблице или нет

Ответ 9

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

Спасибо,

Ответ 10

Как упоминалось в предыдущих ответах, Count(*) учитывает даже столбцы NULL, тогда как count(Columnname) учитывается, только если столбец имеет значения.

Всегда лучше избегать * (Select *, count *,...)