В 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 значения в колонна.

892   10  
sql

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

    Ничего не найдено.