데이터분석/SQL

[SQL] 프로그래머스 GROUP BY - 동명 동물 수 찾기 (GROUP BY, HAVING, ORDER BY)

dataminutestone 2026. 7. 3. 11:41

문제

프로그래머스 GROUP BY - 동명 동물 수 찾기 문제다.

이번 문제는 같은 이름을 가진 동물의 개수를 집계하는 문제로, GROUP BY와 HAVING의 차이를 이해하는 것이 핵심이었다.

문제 조건

  • 이름이 없는 동물은 제외
  • 같은 이름이 2번 이상 나온 경우만 조회
  • 이름 순으로 정렬

처음 접근

처음에는 단순히 이름과 개수만 조회하면 될 것이라고 생각했다.

 
SELECT NAME, COUNT(NAME)
FROM ANIMAL_INS
 

하지만 이 상태에서는 이름별 개수를 계산할 기준이 없기 때문에 원하는 결과를 얻을 수 없다.

그래서 이름을 기준으로 그룹을 만들어 주었다.

 
SELECT NAME, COUNT(NAME)
FROM ANIMAL_INS
GROUP BY NAME
 

실수했던 부분

처음에는 이름이 없는 데이터와 2번 이상 등장한 이름을 모두 WHERE에서 처리하려고 했다.

 
SELECT NAME, COUNT(NAME)
FROM ANIMAL_INS
WHERE NAME IS NOT NULL, COUNT(NAME) > 1
GROUP BY NAME
 

하지만 실행되지 않았다.

생각해 보니 WHERE는 데이터를 먼저 필터링하는 단계이고, COUNT()는 GROUP BY 이후에 계산되는 집계 함수였다.

즉, WHERE에서는 COUNT()를 사용할 수 없었다.


HAVING을 사용하는 이유

집계 결과에 조건을 주려면 HAVING을 사용해야 한다.

  • WHERE : 그룹화 이전 데이터 조건
  • HAVING : 그룹화 이후 집계 결과 조건

따라서 이름이 없는 데이터는 WHERE에서 제거하고,

2번 이상 등장한 이름은 HAVING으로 조건을 걸어야 했다.


최종 코드

 
SELECT NAME, COUNT(NAME)
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
HAVING COUNT(NAME) > 1
ORDER BY NAME;
 

실행 결과

NAMECOUNT
Lucy 3
Raven 2

이번 문제에서 배운 점

  • GROUP BY는 같은 값을 하나의 그룹으로 묶는다.
  • COUNT()는 그룹별 개수를 계산하는 집계 함수이다.
  • WHERE에서는 집계 함수를 사용할 수 없다.
  • 집계 결과에 조건을 줄 때는 HAVING을 사용한다.
  • 코딩테스트에서는 문제에서 정렬을 요구하면 ORDER BY를 반드시 작성하는 것이 좋다. GROUP BY만 사용했다고 정렬이 보장되는 것은 아니다.

마무리

이번 문제는 SQL 문법 자체는 어렵지 않았지만, WHERE와 HAVING의 차이를 제대로 이해하는 것이 중요했다.

특히 COUNT()를 어디에서 사용할 수 있는지 헷갈렸는데, 직접 오류를 겪고 수정하면서 두 절의 역할을 확실히 구분할 수 있었다.

앞으로 GROUP BY 문제가 나오면 **데이터를 먼저 걸러야 하는 조건은 WHERE, 집계된 결과를 걸러야 하는 조건은 HAVING**이라는 점을 기억하면서 풀어야겠다.


출처

  • 프로그래머스 SQL 고득점 Kit - GROUP BY - 동명 동물 수 찾기