В 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) вычисляет выражение для каждой строки в группе и возвращает количество ненулевых значений.
поэтому 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значения. ЭлементWebsiteUrlколичество гораздо ниже, хотя, потому что этот столбец позволяетnull.
в основном функция COUNT (*) возвращает все строки из таблицы, тогда как COUNT (COLUMN_NAME) этого не делает; то есть она исключает нулевые значения, которые все здесь также ответили здесь. Но самая интересная часть-сделать запросы и оптимизировать базу данных лучше использовать COUNT (*), если не делать несколько подсчетов или сложный запрос, а не COUNT (COLUMN_NAME). В противном случае это действительно снизит производительность вашей БД при работе с огромным количеством данных.
- предложение COUNT(*) указывает, что SQL Server возвращает все строки из таблицы, включая значения null.
- 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 *,...)
Comments