В SQL, в чем разница между count(столбец) и count(*)?

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

select column_name, count(column_name)
from table
group by column_name
having count(column_name) > 1;

какая разница, если бы Я заменил все вызовы на count(column_name) to count(*)?

этот вопрос был вдохновлен как найти повторяющиеся значения в таблице в Oracle?.


чтобы уточнить принятый ответ (и, возможно, мой вопрос), заменив count(column_name) С count(*) вернет дополнительную строку в результате, которая содержит null и null значения в колонна.

10 ответов


count(*) считает нули и 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


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

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

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


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

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

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

поэтому count (*) включает нули, другой метод-нет.


мы можем использовать Stack Exchange Data Explorer чтобы проиллюстрировать разницу простым запросом. Таблица Users в базе данных Stack Overflow содержит столбцы, которые часто остаются пустыми, например 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(*), потому что не дает null значения. The WebsiteUrl количество намного ниже, хотя, потому что этот столбец позволяет null.


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


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

см. следующий код для выполнения тестов 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

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

Count(1) in place of column name or * 

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


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

спасибо,


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

это всегда лучшая практика, чтобы избежать * (Select *, count *,...)