SQL에서 count (column)과 count (*)의 차이점은 무엇입니까?


205

다음과 같은 쿼리가 있습니다.

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열의 값을.

답변:


235

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


8
궁금한 점이 있습니다. 모든 NULL 이있는 행이 있으면 count (*)가 여전히 그것을 계산합니까, 아니면 모든 열에 대해 count (열)입니까?
Joel Coehoorn

7
이 표준은 DBMS와 일치합니까?
Eclipse

51
ID와 같이 Null을 허용하지 않는 열이 있으면 count (ID)가 count (*)보다 성능이 크게 향상된다는 점을 언급 할 가치가 있습니다.
tsilb

12
@tsilb : @Alan에 의해 게시 된 답변은 "count (*)는 실제 데이터 행이 아닌 해당 테이블의 인덱스를보고 계산됩니다"라고 말하면 true이면 주석이 무효화됩니다. @Alan이 잘못되었다는 점에 감사 드리지만 올바른 정보를 찾기 위해 귀하의 정보 출처에 관심이 있습니다.
Tony

12
@tsilb : 많은 최신 쿼리 최적화 프로그램에서 count (*)를 최적화하여 원하는 경우 인덱스를 사용합니다.
섀넌 세브란스

37

*와 특정 열을 사용하는 것의 또 다른 사소한 차이점은 열의 경우 키워드 DISTINCT를 추가하고 개수를 다른 값으로 제한 할 수 있다는 것입니다.

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

1
그룹 별 열과 계산중인 그룹이 달라야합니까? 그렇지 않으면이 쿼리에서 아무것도 얻지 못할 것입니다
steevc

예, 죄송합니다. 예제에서 동일한 열임을 알지 못했습니다. 게시물을 업데이트하겠습니다.
Brannon

16

또 다른 미묘한 차이는 일부 데이터베이스 구현에서 실제 데이터 행이 아닌 해당 테이블의 인덱스를보고 count (*)가 계산된다는 것입니다. 특정 열이 지정되지 않았으므로 실제 열과 해당 값을 신경 쓸 필요가 없습니다 (특정 열을 계산 한 경우와 마찬가지로). 데이터베이스가 인덱스 데이터를 사용하도록 허용하면 "실제"행을 계산하는 것보다 훨씬 빠릅니다.


5
+1 예, Oracle 및 9.2 이후 PostgreSQL의 경우 확실히 해당됩니다.
David Aldridge

@DavidAldridge 언급 된 문서 (특히 postgresql)에 대한 포인터를 제공 할 수 있습니까? 감사.
부샨


10

docs 의 설명은 이것을 설명하는 데 도움이됩니다.

COUNT (*)는 NULL 값 및 중복을 포함하여 그룹의 항목 수를 반환합니다.

COUNT (expression)은 그룹의 각 행에 대한 표현식을 평가하고 널이 아닌 값의 수를 리턴합니다.

따라서 count (*)는 null을 포함하지만 다른 방법은 null을 포함하지 않습니다.


SQL newbs의 경우 : 어떤 도움말 파일을 참조하고 있습니까?
빌 도마뱀

10

우리는 사용할 수있는 스택 Exchange 데이터 탐색기를 간단한 쿼리와의 차이를 설명하기 위해. Stack Overflow 데이터베이스의 Users 테이블에는 사용자의 웹 사이트 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.


2

기본적으로 COUNT(*)함수는 테이블에서 모든 행을 반환하지만 COUNT(COLUMN_NAME)그렇지는 않습니다. 즉, 여기의 모든 사람들이 여기에 대답 한 null 값은 제외됩니다. 그러나 가장 흥미로운 부분은 쿼리와 데이터베이스를 최적화하는 것이 COUNT(*)아니라 여러 번 계산하거나 복잡한 쿼리를 수행하지 않는 한 사용 하는 것이 좋습니다 COUNT(COLUMN_NAME). 그렇지 않으면 엄청난 수의 데이터를 처리하는 동안 실제로 DB 성능이 저하됩니다.


1
  • 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

1

COUNT(*) – 테이블의 총 레코드 수를 리턴합니다 (NULL 값의 레코드 포함).

COUNT(Column Name) – NULL이 아닌 총 레코드 수를 리턴합니다. 즉, 특정 열의 NULL 값 레코드 계산을 무시합니다.


0

사용하는 것이 가장 좋습니다

Count(1) in place of column name or * 

테이블의 행 수를 계산하려면 열 이름이 테이블에 있는지 여부를 확인하지 않기 때문에 모든 형식보다 빠릅니다.


4
적어도 Oracle과 다른 RDBMS에 대해서는 올바르지 않습니다. 내부적으로 count (1)은 count (*)로 변환됩니다. 특히 count (*)의 성능은 행의 크기에 의해 악영향을받지 않으며 이는 일반적인 오해입니다.
David Aldridge

이것은 SQL Server에 해당됩니다. @Ali Adravi 말했듯이, COUNT(*)에 비해 COUNT(columnName), 그것 때문에 단지 열거 행을 열 값을 확인하지 않습니다. 그러나 기둥에 적용 COUNT(columnName)해도 느려집니다 ! 물론 적어도 SQL Server에서는. countid
ABS

0

하나의 열이 테이블에 수정 되어도 계산에 필요한 열 수를 지정하는 것보다 두 개 이상의 열을 사용하려는 경우에는 차이가 없습니다.

감사,


0

이전 답변에서 언급 한 바와 같이, Count(*)심지어 카운트 NULL반면, 열을 count(Columnname)열 값이있는 경우에만 계산됩니다.

그것은 항상 방지 할 수있는 가장 좋은 방법입니다 *( Select *, count *, ...)


피하는 것이 가장 좋은 방법은 아닙니다.COUNT(*)
David Faber
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.