본문 바로가기
Database

[SQL] COUNT(*), COUNT(1), COUNT(expression)의 이해

by 데브겸 2023. 6. 18.

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(*) vs Count(1) - SQL Server

Just wondering if any of you people use Count(1) over Count(*) and if there is a noticeable difference in performance or if this is just a legacy habit that has been brought forward from days gone ...

stackoverflow.com

 

현업 개발자들 중에 COUNT(1)을 습관적으로 쓰는 분이 많은 것 같다는 느낌 정도?