다음과 같은 쿼리가 있습니다.
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
열의 값을.
답변
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
답변
*와 특정 열을 사용하는 것의 또 다른 사소한 차이점은 열의 경우 키워드 DISTINCT를 추가하고 개수를 다른 값으로 제한 할 수 있다는 것입니다.
select column_a, count(distinct column_b)
from table
group by column_a
having count(distinct column_b) > 1;
답변
또 다른 미묘한 차이는 일부 데이터베이스 구현에서 실제 데이터 행이 아닌 해당 테이블의 인덱스를보고 count (*)가 계산된다는 것입니다. 특정 열이 지정되지 않았으므로 실제 열과 해당 값을 신경 쓸 필요가 없습니다 (특정 열을 계산 한 경우와 마찬가지로). 데이터베이스가 인덱스 데이터를 사용하도록 허용하면 “실제”행을 계산하는 것보다 훨씬 빠릅니다.
답변
docs 의 설명은 이것을 설명하는 데 도움이됩니다.
COUNT (*)는 NULL 값 및 중복을 포함하여 그룹의 항목 수를 반환합니다.
COUNT (expression)은 그룹의 각 행에 대한 표현식을 평가하고 널이 아닌 값의 수를 리턴합니다.
따라서 count (*)는 null을 포함하지만 다른 방법은 null을 포함하지 않습니다.
답변
우리는 사용할 수있는 스택 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
.
답변
기본적으로 COUNT(*)
함수는 테이블에서 모든 행을 반환하지만 COUNT(COLUMN_NAME)
그렇지는 않습니다. 즉, 여기의 모든 사람들이 여기에 대답 한 null 값은 제외됩니다. 그러나 가장 흥미로운 부분은 쿼리와 데이터베이스를 최적화하는 것이 COUNT(*)
아니라 여러 번 계산하거나 복잡한 쿼리를 수행하지 않는 한 사용 하는 것이 좋습니다 COUNT(COLUMN_NAME)
. 그렇지 않으면 엄청난 수의 데이터를 처리하는 동안 실제로 DB 성능이 저하됩니다.
답변
- 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