문제 설명
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
동물 보호소에 들어온 동물의 이름은 몇 개인지 조회하는 SQL 문을 작성해주세요. 이때 이름이 NULL인 경우는 집계하지 않으며 중복되는 이름은 하나로 칩니다.
해설
- DISTINCT : 중복을 없애주지만 정렬을 하지는 않는다.(DISTINCT 키워드는 옆에 온 모든 컬럼을 고려하여 중복 제거를 진행합니다.)
- GROUP BY : 중복을 없애주고 정렬도 해준다.
그래서 아래처럼 작성했더니 틀렸다.
근데 아래는 맞았다.
그럼 다시 해설을 찾아봤다.
MySQL에서 유형별로 갯수를 가져오고 싶은데, 단순히 COUNT 함수로 데이터를 조회하면 전체 갯수만을 가져옵니다.
이렇게 유형별로 갯수를 알고 싶을 때는 컬럼에 데이터를 그룹화 할 수 있는 GROUP BY를 사용하는 것입니다.
GROUP BY를 사용할 때는 두가지를 기억해야 합니다.
특정 컬럼을 그룹화 하는 GROUP BY
특정 컬럼을 그룹화한 결과에 조건을 거는 HAVING
* WHERE랑 HAVING을 헷깔리는 경우가 많은데 WHERE는 그룹화 하기 전이고, HAVING은 그룹화 후에 조건입니다.
위의 이유이다.
따라서 그룹화 하기 전의 갯수를 세야하는 것이다.
따라서 distinct를 사용하여 그룹화 하기 전에 이미 null 값, 중복값을 제외하고 나서 결과를 return 하는 것이다.
group by를 했으면 having으로 조건을 처리했어야했는데, 그룹화 후라서 결과가 다르게 나온다.
'코테공부' 카테고리의 다른 글
프로그래머스 48일차 - 프린터 (0) | 2023.04.05 |
---|---|
프로그래머스 47일차 - 예상 대진표 (0) | 2023.04.04 |
프로그래머스 46일차 - NULL 처리하기 (0) | 2023.04.03 |
프로그래머스 46일차 - 주식가격 (0) | 2023.04.03 |
프로그래머스 46일차 - 소수 찾기 (0) | 2023.04.03 |