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