
ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.
| NAME | TYPE | NULLABLE |
|---|---|---|
| ANIMAL_ID | VARCHAR(N) | FALSE |
| ANIMAL_TYPE | VARCHAR(N) | FALSE |
| DATETIME | DATETIME | FALSE |
| NAME | VARCHAR(N) | TRUE |
| SEX_UPON_OUTCOME | VARCHAR(N) | FALSE |
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
이 문제는 간단하게 HOUR() 함수를 사용하여 GROUP BY를 한 뒤, 09시부터 19시 사이에 있는 입양 건수를 구하면 되는 문제이다.
이때 한가지 살펴볼 점으론, WHERE 절과 HAVING 절의 차이를 볼 수 있다는 점이다.
WHERE 절로 조건을 적용할 시, WHERE절은 GROUP BY 절보다 먼저 실행되어 Row by Row로 각각의 행들을 살펴보는 보기때문에 ALIAS를 사용할 수 없다.
그러나 HAVING 절의 경우 GROUP BY 이후에 실행되기 때문에 먼저 시간대 별로 그룹이 만들어 진 후 조건에 따라 레코드를 필터링 한다. 따라서 ALIAS를 사용할 수 있다.
# WHERE 절
SELECT HOUR(DATETIME) AS HOUR
,COUNT(*) AS COUNT
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) BETWEEN 9 AND 19
GROUP
BY HOUR
ORDER
BY HOUR ASC;
# HAVING 절
SELECT HOUR(DATETIME) AS HOUR
,COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP
BY HOUR
HAVING HOUR BETWEEN 9 AND 19
ORDER
BY HOUR ASC;
SQL의 코드 실행 순서를 간단하게 볼 수 있는 문제였다.
https://school.programmers.co.kr/learn/courses/30/lessons/59412