본문 바로가기

데이터 베이스/Programmers

[프로그래머스 SQL 고득점 Kit] 중복 제거하기

그룹 함수 문제

https://school.programmers.co.kr/learn/courses/30/lessons/59408

 

 


[문제 설명]

 

주어진 테이블 내에서 NULL을 제외한 동물의 이름이 몇 개인지 출력하는 문제입니다.

 

단순히 열이 몇 개 인지 구현한다면 COUNT(*)로 끝낼 수 있습니다.

그러나 동물 이름에 대해 중복을 제거하고 COUNT해줘야 하는 문제입니다.

 

중복을 제거하는 키워드인 DISTINCT를 NAME에 사용하여 중복을 제거하고 COUNT를 하면 해결됩니다.

(= COUNT(DISTINCT NAME))

 

 

어려운 문제는 아니지만 헷갈릴만한 부분이 두 가지 있습니다.

 

첫 번째로는 COUNT(DISTINCT NAME) / DISTINCT COUNT(NAME) 의 차이점입니다.

차근차근 살펴보면

COUNT(DISTINCT NAME) => COUNT(중복 제거된 이름) => 중복 제거 후 COUNT

DISTINCT COUNT(NAME) => COUNT(이름)을 하고 중복 제거 => COUNT 후 중복 제거

 

DISTINCT COUNT(NAME)은 NAME의 COUNT한 결과(한 줄)에 대해 중복을 제거하므로 아무 의미가 없게 됩니다.

 

두 번째로는 NULL 제거입니다.

구글링을 조금 해보니 대부분의 코드에서 WHERE NAME IS NOT NULL을 사용하여 NULL인 경우를 제거하고 있었습니다.

하지만 COUNT같은 그룹함수는 자체적으로 NULL을 포함하지 않으므로 이 문제를 해결하는 데에 WHERE절은 필요가 없습니다.

 

※ COUNT(*)처럼 모든 열을 다 보면서 세는 경우에 특정 열이 NULL인 행을 제외하고 싶다면 그때 WHERE절을 사용하면 됩니다.

 


[소스 코드] / ORACLE SQL

 

SELECT COUNT(DISTINCT NAME)
FROM ANIMAL_INS;