В SQL, в чем разница между количеством (столбец) и количеством (*)? - PullRequest
195 голосов
/ 12 сентября 2008

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

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 и количество null значений в столбце. 1017 *

Ответы [ 11 ]

226 голосов
/ 12 сентября 2008

count(*) считает NULL и count(column) не

[править] добавил этот код, чтобы люди могли его запустить

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

36 голосов
/ 12 сентября 2008

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

select column_a, count(distinct column_b)
from table
group by column_a
having count(distinct column_b) > 1;
16 голосов
/ 14 сентября 2008

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

10 голосов
/ 14 июня 2010

Мы можем использовать 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(*), поскольку столбец Id не позволяет null ценности. Число WebsiteUrl намного ниже, хотя, поскольку этот столбец позволяет null.

10 голосов
/ 12 сентября 2008

Объяснение в документах , помогает объяснить это:

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

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

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

2 голосов
/ 05 мая 2013

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

1 голос
/ 24 марта 2019

COUNT(*) - Возвращает общее количество записей в таблице (включая записи с нулевым значением).

COUNT(Column Name) - Возвращает общее количество записей, отличных от NULL. Это означает, что он игнорирует подсчет записей с нулевым значением в этом конкретном столбце.

1 голос
/ 16 февраля 2012
  • Предложение 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
0 голосов
/ 02 мая 2016

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

Всегда лучше избегать * (Select *, count *,…)

0 голосов
/ 21 сентября 2012

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

Спасибо

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