CodeGym /행동 /SQL SELF /COUNT()로 행 개수 세기와 그 변형들

COUNT()로 행 개수 세기와 그 변형들

SQL SELF
레벨 7, 레슨 1
사용 가능

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가 먼저 행을 거른 다음에 세는 거야.

이런 디테일 때문에 쿼리에서 논리적 실수가 자주 나와. 항상 신경 써!

2
과제
SQL SELF, 레벨 7, 레슨 1
잠금
테이블의 모든 행 개수 세기
테이블의 모든 행 개수 세기
2
과제
SQL SELF, 레벨 7, 레슨 1
잠금
0이 아닌 가격을 가진 행의 개수 세기
0이 아닌 가격을 가진 행의 개수 세기
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION