Introduction
COUNT()는 SQL에서 가장 많이 사용하는 집계함수 중 하나!
많이 사용하긴 하지만 이 COUNT()에도 생각보다 더 복잡한 내용들이 있어서 정리해둔다.
test 테이블의 value 컬럼에 대해서 각각 COUNT(*), COUNT(1), COUNT(value), COUNT(DISTINCT value)를 날렸을 때 어떤 값들이 나올까? (처음 위와 거의 비슷한 문제가 나왔을 때 풀지 못했었다...)
정답은 7, 7, 0, 6, 4.
COUNT()의 기본적인 원리
count()는 기본적으로 괄호 안에 들어가는 조건에 맞는 레코드의 수를 세주는 것.
그렇기 때문에 ()안에 들어가는 조건이 무엇인지가 중요해진다.
COUNT()의 용례
- COUNT(*): NULL이나 중복값에 상관없이 모든 행을 카운트한 값을 보여준다
- COUNT(1): COUNT(*)와 동일하다. 마찬가지로 NULL이나 중복값 상관없이 모든 행의 갯수를 카운트하여 보여준다
- COUNT(NULL): 이 친구는 무조건 0이 나온다
- COUNT(expression): NULL이 아닌 값을 카운트하여 보여준다
- 여기에서 expression은 컬럼 명이나 여러 조건식등을 말함
- COUNT(DISTINCT expression): NULL이 아닌 것들 중에 중복을 제외한 고유한 값만 카운트하여 보여준다
COUNT(*) 와 COUNT(1)의 차이
처음 공부했을 때 나를 아주 미치게했던 부분이다. 둘의 차이는 대체 무엇인가...
결론적으로 말하자면 차이는 거의 없다고 보는 것이 맞을 것 같다.
MySQL 공식 문서에도 관련 내용이 있고
InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.
오라클 문서에도 관련 내용이 있음
nothing, they are the same, incur the same amount of work -- do the same thing, take the same amount of resources.
물론 둘의 성능을 실험해봤더니 뭐가 좀 더 빠르다더라라는 말이 좀 있는 것 같긴 하지만
엄청나게 최적화할일이 아니라면 그냥 써도 무방할 것 같음
https://stackoverflow.com/questions/1221559/count-vs-count1-sql-server
현업 개발자들 중에 COUNT(1)을 습관적으로 쓰는 분이 많은 것 같다는 느낌 정도?
'Database' 카테고리의 다른 글
DB Concurrency Control - Isolation with Lock, Snapshot Isolation, MVCC (0) | 2023.10.02 |
---|---|
DB Concurrency Control - Read phenomena, Isolation level (0) | 2023.09.28 |
DB Concurrency Control - Schedule, Serializability, Recoverability (0) | 2023.09.28 |
[Postgresql, Redshift] 데이터 현황 확인하기 (0) | 2023.06.27 |
외부에서 MySQL DB 접속하기 (0) | 2023.02.14 |