0Pricing
SQL Interview Prep · 강의

COUNT(*)와 COUNT(열) 및 COUNT(DISTINCT)

각 COUNT 형식이 NULL과 중복 값을 처리하는 방식을 묻는 고전적인 질문을 다룹니다.

COUNT(*)와 COUNT(열) 및 COUNT(DISTINCT)은(는) CoddyKit의 무료 SQL Interview Prep 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

받게 될 질문

SQL 면접을 보게 된다면 처음 10분 안에 다음 질문을 받을 것으로 예상하십시오. COUNT(*), COUNT(column), COUNT(DISTINCT column)의 차이는 무엇입니까?

사소해 보이지만 면접관은 집계 함수가 NULL 값과 중복을 어떻게 처리하는지 진정으로 이해하는지 확인하는 데 이 질문을 사용합니다. 자신 있고 정확하게 답하면 구문을 외운 것뿐 아니라 실제 질의를 작성해 보았다는 신호가 됩니다.

이제 즉시 답하고 그 이유까지 설명할 수 있도록 매우 탄탄한 개념 모델을 만들어 보겠습니다.

<code>COUNT(*)</code>는 행을 셉니다

COUNT(*)는 행을 셉니다. 어떤 열의 값도 전혀 확인하지 않으므로 NULL은 관계없습니다. 테이블에 100개의 행이 있으면 COUNT(*)는 단언컨대 100을 반환합니다.

여기서 별표는 열을 곱하거나 확장한다는 뜻이 아닙니다. "조건을 충족하는 모든 행을 세라"는 의미의 특수 토큰입니다. 질문이 단순히 "레코드가 몇 개인가?"일 때 사용하는 형식입니다.

SELECT COUNT(*) AS total_rows
FROM employees;

생각해 볼 샘플 데이터

작은 테이블 하나를 기준으로 모든 내용을 살펴보겠습니다. NULL을 허용하는 department 열이 있는 employees 테이블을 생각해 보십시오.

  • 앨리스, 영업
  • 밥, 영업
  • 캐럴, NULL
  • 댄, 엔지니어링
  • 이브, NULL

총 5개 행입니다. 세 행에는 부서 값(영업, 영업, 엔지니어링)이 있고 두 행에는 NULL이 있습니다. 이 숫자를 기억해 두십시오. 이 테이블을 세 가지 방법으로 세어 보겠습니다.

<code>COUNT(column)</code>은 NULL을 건너뜁니다

COUNT(column)은 해당 열이 NULL이 아닌 행만 셉니다. NULL 값은 완전히 무시합니다.

샘플 데이터에서 COUNT(department)는 5가 아니라 3을 반환합니다. 부서 값 두 개가 NULL이기 때문입니다. 이 수업 전체에서 가장 중요한 사실은 다음과 같습니다. 열의 COUNT는 NULL을 절대 세지 않습니다.

SELECT COUNT(department) AS depts_present
FROM employees;
-- returns 3 on our sample data

지금까지의 두 가지 비교

같은 5개 행의 테이블을 나란히 비교하면 다음과 같습니다.

  • COUNT(*) = 5 (모든 행)
  • COUNT(department) = 3 (NULL이 아닌 부서)

둘의 차이인 5 빼기 3은 NULL인 부서의 개수와 같습니다. 유용한 면접 요령 하나를 소개하면, COUNT(*) - COUNT(col)를 사용하면 별도의 WHERE 절을 작성하지 않고도 해당 열의 NULL 개수를 구할 수 있습니다.

SELECT COUNT(*) - COUNT(department) AS null_departments
FROM employees;
-- returns 2

COUNT(DISTINCT 열)

COUNT(DISTINCT column)은 고유한 NULL이 아닌 값의 개수를 셉니다. 먼저 중복을 제거하고, 그다음 NULL을 무시한 후, 남은 값을 셉니다.

이 데이터에서 고유한 부서 값은 영업과 엔지니어링이므로 COUNT(DISTINCT department)는 2를 반환합니다. NULL 두 개는 세지 않고, 중복된 영업 값은 하나로 합쳐집니다.

SELECT COUNT(DISTINCT department) AS unique_depts
FROM employees;
-- returns 2

세 가지를 함께 보기

5개 행의 테이블을 전체적으로 보면 다음과 같습니다.

  • COUNT(*) = 5 — 행
  • COUNT(department) = 3 — NULL이 아닌 값
  • COUNT(DISTINCT department) = 2 — 고유한 NULL이 아닌 값

NULL을 고려한 다음 중복을 고려하는 이 순서를 외울 수 있다면 전체 개념을 이해한 것입니다. 각 형식이 바로 위 형식보다 작거나 같은 값을 반환한다는 점에 주목하십시오.

SELECT
  COUNT(*)                       AS rows_total,
  COUNT(department)              AS depts_present,
  COUNT(DISTINCT department)     AS unique_depts
FROM employees;

면접 변형 문제 풀이

면접관은 다음과 같이 질문을 조금 바꾸어 내기도 합니다. "부서에 배정된 직원은 몇 명이고, 고유한 부서는 몇 개입니까?"

첫 번째 부분은 COUNT(department)입니다. 배정되었다는 것은 NULL이 아니라는 뜻입니다. 두 번째 부분은 COUNT(DISTINCT department)입니다. 각 표현이 어떤 COUNT에 대응하는지 알아보는 것이 바로 이 문제에서 확인하려는 능력입니다.

SELECT
  COUNT(department)          AS assigned_employees,
  COUNT(DISTINCT department) AS distinct_departments
FROM employees;

조건과 함께 사용하는 COUNT

자주 이어지는 질문은 조건을 충족하는 행만 세는 방법입니다. 깔끔하고 이식성 높은 방법은 CASE 표현식에 COUNT를 적용하는 것입니다. COUNT(column)은 NULL을 건너뛰므로, 제외하려는 행에 대해서는 CASE가 NULL을 반환하도록 만들면 됩니다.

여기서는 영업 직원 수를 셉니다. CASE는 영업 행에만 값을 반환하고 나머지 행에는 NULL을 반환하므로, COUNT는 해당 행만 집계합니다.

SELECT
  COUNT(CASE WHEN department = 'Sales' THEN 1 END) AS sales_count
FROM employees;
-- returns 2

피해야 할 일반적인 실수

면접관이 일부러 심어 둔 다음 함정을 주의하십시오.

  • COUNT(column)이 COUNT(*)와 같다고 생각하는 것 — 해당 열에 NULL이 하나도 있을 때만 같습니다.
  • COUNT(DISTINCT col)이 NULL을 고유한 값 하나로 포함한다고 생각하는 것 — 그렇지 않습니다.
  • COUNT(1)이 NULL을 건너뛸 것으로 예상하는 것 — COUNT(*)처럼 작동하여 모든 행을 셉니다.

면접에서 이러한 내용을 먼저 언급하면 깊이 있는 이해를 보여 줄 수 있습니다.

COUNT(1)과 COUNT(상수)

지원자들은 종종 COUNT(*)와 COUNT(1) 중 어느 쪽이 더 빠른지 묻습니다. 답은 두 방식이 의미상 동일하다는 것입니다 — 둘 다 NULL과 관계없이 모든 행을 세며, 최신 최적화기는 두 방식을 동일하게 처리하므로 실제 성능 차이는 없습니다.

COUNT(1) 안의 상수는 절대 NULL이 아니므로 어떤 행도 건너뛰지 않습니다. 명확성을 위해 COUNT(*)를 사용하십시오. 이 형식이 관용적인 방식입니다.

SELECT COUNT(*) AS a, COUNT(1) AS b
FROM employees;
-- a and b are always equal

빠른 확인

샘플 테이블을 대상으로 개념 모델을 확인해 보십시오.

복습

이제 가장 자주 묻는 집계 질문을 완전히 이해하셨습니다.

  • COUNT(*)는 NULL을 포함한 모든 행을 셉니다.
  • COUNT(column)은 NULL이 아닌 값만 셉니다.
  • COUNT(DISTINCT column)은 고유한 NULL이 아닌 값을 셉니다.
  • COUNT(*) - COUNT(col)를 사용하면 NULL 개수를 바로 구할 수 있습니다.
  • COUNT(1)은 COUNT(*)와 같습니다 — NULL을 건너뛰지 않으며 속도 차이도 없습니다.

간결하게 말하고 그 이유까지 뒷받침하십시오. 다음은 SUM과 AVG가 NULL을 처리하는 방식입니다.

자주 묻는 질문

“COUNT(*)와 COUNT(열) 및 COUNT(DISTINCT)” 강의는 무료인가요?

네 — “COUNT(*)와 COUNT(열) 및 COUNT(DISTINCT)” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Interview Prep 강의 전체를 잠금 해제할 수 있습니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

“COUNT(*)와 COUNT(열) 및 COUNT(DISTINCT)”에서 뭘 배우나요?

각 COUNT 형식이 NULL과 중복 값을 처리하는 방식을 묻는 고전적인 질문을 다룹니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

SQL Interview Prep을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 SQL Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“COUNT(*)와 COUNT(열) 및 COUNT(DISTINCT)” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 SQL Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 SQL Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. COUNT(*)와 COUNT(열) 및 COUNT(DISTINCT)
  2. NULL이 있는 SUM과 AVG
  3. MIN, MAX와 숫자가 아닌 값의 집계
  4. GROUP BY 없이 집계하기
← SQL Interview Prep(으)로 돌아가기