개인공부/알고리즘

프로그래머스 - 동명 동물 수 찾기 (MySQL)

KEEMSY 2023. 7. 30. 00:12

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

해당 문제를 풀이하는데 핵심은 집계함수를 사용할줄 아느냐(COUNT), 집계함수에 조건을 추가할 수 있는가(HAVING) 이다.

 

SELECT NAME, COUNT(*) AS COUNT
FROM ANIMAL_INS
WHERE NAME IS NOT NULL 
GROUP BY NAME
HAVING COUNT >= 2
ORDER BY NAME

 

이 문제에서 질문의 수가 많아 한번 확인해보았는데, 생각보다 WHERE 절과 HAVING 절의 차이를 모르는 사람들이 많은듯하였다.

  • WHERE 절: 조건이 개별 행 값에 적용되어 조건을 만족하는 행만 결과에 포함된다.
  • HAVING 절:  집계가 수행된 후, 결과를 필터링한다. 이 때, 개별 행이 아닌 행 그룹에서 작동한다.

문제로 설명을 이어가본다면, 다음과같다.

WHERE NAME IS NOT NULL

1. (SELECT 와 FROM에서 어떤 테이블에서 어떤 열을 가져올지 지정하고) 데이터 모음에서, 데이터를 필터링(NAME 이 NULL 이 아닌 데이터들) 한다. 이는 그룹화 및 집계(있는경우)가 발생하기 전에 이뤄진다.

 

GROUP BY NAME

2. 지정된 열(NAME)을 기준으로 행을 그룹화 한다. 이때 해당 열은 집계함수와 함께 사용된다.

 

HAVING COUNT >= 2

3. GROUP BY 절에 의해 생성된 그룹을 집계함수와 관련된 조건(COUNT >= 2)에 따라 필터링 한다.

 

ORDER BY NAME

4. 열(NAME) 을 기준으로 결과 데이터를 정렬한다.

 

 

이렇게보면, 쿼리의 작동순서를 알고 있다면, 해당 문제를 쉽게 해결할 수 있다.

728x90