В 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 *
,...)