COUNT() 함수는 SQL에서 제일 많이 쓰이고 유용한 집계 함수 중 하나야. 이 함수의 주된 목적은 쿼리 결과에서 행의 개수를 세는 거지. 만약 COUNT() 함수가 SQL 세계의 슈퍼히어로라면, 얘의 초능력은 이런 질문에 빠르게 답해주는 거야:
- 회사에 직원이 몇 명 있어?
- 각 학과에 학생이 몇 명이야?
- 지난달에 상품이 몇 개 팔렸어?
COUNT()의 문법은 꽤 간단해:
COUNT(열)
여기서 열은 행을 셀 때 쓸 열의 이름이야. 근데 이거 말고도 다른 방식들이 있는데, 그건 아래에서 더 다뤄볼게.
가장 기본적인 COUNT() 사용법부터 시작하자.
버전 1: COUNT(*)로 모든 행 세기
테이블에서 데이터가 있든 없든 모든 행을 세고 싶을 때는 COUNT(*)를 써. 별표는 "모든 열"이라는 뜻이야.
예시: students 테이블이 이렇게 있다고 해보자:
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | 22 |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
다음 쿼리를 실행해보자:
SELECT COUNT(*)
FROM students;
결과:
| count |
|---|
| 4 |
COUNT(*) 함수는 각 열에 NULL 값이 있든 없든 그냥 테이블의 모든 행을 세는 거라서 NULL 값은 신경 안 써.
버전 2: COUNT(column)으로 특정 열에 값이 있는 행만 세기
근데 만약 특정 열에 NULL이 아닌 값이 있는 행만 세고 싶으면? 그럴 땐 COUNT(column)을 써.
예시: 이름이 적혀 있는 학생만 세보자.
SELECT COUNT(name)
FROM students;
결과:
| count |
|---|
| 3 |
차이점 보이지? 테이블엔 4행이 있지만, 그 중 한 행의 name 열이 NULL이야. COUNT(column) 함수는 그 열이 NULL인 행은 무시해.
COUNT(*)와 COUNT(column) 비교
그럼 이 두 가지 방식, COUNT(*)와 COUNT(column)의 차이는 뭘까?
COUNT(*)는 모든 행을 세. 어떤 열에NULL이 있든 상관없어.COUNT(column)은 지정한 열에 NULL이 아닌 값이 있는 행만 세.
예시 테이블:
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
쿼리들:
-- 모든 행을 센다.
SELECT COUNT(*) FROM students; -- 4 -- TOTAL (모든 행)
-- 이름이 NULL이 아닌 행만 센다.
SELECT COUNT(name) FROM students; -- 3 -- 이름이 있는 행만 세기
-- 나이가 NULL이 아닌 행만 센다.
SELECT COUNT(age) FROM students; -- 3 -- 나이가 있는 행만 세기
버전 3: COUNT(DISTINCT column)으로 유니크 값 세기
가끔은 열에서 유니크한 값만 세고 싶을 때가 있어. 예를 들어, 학생들의 나이가 몇 가지가 있는지 알고 싶을 때 COUNT(DISTINCT column)이 딱이야.
예시:
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(DISTINCT age) FROM students;
결과:
| count |
|---|
| 3 |
여기서 DISTINCT는 중복뿐만 아니라 NULL 값도 무시한다는 점에 주목해.
DISTINCT를 COUNT(*)랑 같이 쓰려고 하면 에러 나니까 주의! DISTINCT는 특정 열에만 쓸 수 있어.
COUNT() 실제 문제에서 쓰는 예시들
예시 1. 학생 수 세기
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(*) AS total_students
FROM students;
결과:
| total_students |
|---|
| 4 |
예시 2. 나이가 적혀 있는 학생 수 세기
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(age) AS students_with_age
FROM students;
결과:
| students_with_age |
|---|
| 3 |
예시 3. 유니크한 나이 개수 세기
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 20 |
SELECT COUNT(DISTINCT age) AS unique_ages
FROM students;
결과:
| unique_ages |
|---|
| 2 |
COUNT() 쓸 때 자주 하는 실수들
COUNT(column)이 NULL이 있어도 모든 행을 세줄 거라고 기대하기.
이건 아니야: COUNT(column)은 지정한 열이 NULL인 행은 무시해.
COUNT(*)로 유니크 값 세려고 하기.
이럴 땐 COUNT(DISTINCT column)을 써야 해.
필터링된 데이터에서 세는 걸 깜빡하기.
예를 들어:
SELECT COUNT(*) FROM students WHERE age > 20;
이 쿼리는 20살 넘는 학생만 세는 거고, WHERE가 먼저 행을 거른 다음에 세는 거야.
이런 디테일 때문에 쿼리에서 논리적 실수가 자주 나와. 항상 신경 써!
GO TO FULL VERSION