Algorithm

[Oracle / 프로그래머스 SQL] 입양 시각 구하기(1) - having 절과 쿼리 실행 순서

devkmee 2022. 2. 15. 16:21

[ 코디테스트 연습 > GROUP BY > 입양 시각 구하기 (1) ]

 

1. 테이블 정보

 

2. 문제

보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 

09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 

이때 결과는 시간대 순으로 정렬해야 합니다.

 

3. 요구사항 분석 및 SQL문

-- 조회 : 입양시간, 입양횟수
-- 그룹 : 시간대별
-- 정렬 : 시간대 오름차순
SELECT 
    TO_CHAR(DATETIME, 'HH24') AS ADP_HOUR 
  , COUNT(DATETIME) AS ADP_CNT
FROM 
    ANIMAL_OUTS
GROUP BY 
    TO_CHAR(DATETIME, 'HH24')
HAVING 
    TO_CHAR(DATETIME, 'HH24') BETWEEN 09 AND 19
ORDER BY ADP_HOUR

>>

GROUP BY 와 HAVING 절에 별칭 (ADP_HOUR)를 사용했는데 계속 식별할 수 없다는 오류가 떴다.

ORDER BY에는 멀쩡히 인식하는 별칭을 왜 쓸 수 없는것인지,

한번 정의한 ADP_HOUR를 왜 3번이나 반복해서 써야하는지 이해 할 수 없었는데

 

오라클 쿼리 실행순서를 고려하지 않았기 때문이었다.

자바의 변수처럼 별칭은 한번 정의한 값을 담을 것이고, 코드는 위에서 아래로 수행 될 것이라 생각했다.

그래서 이 참에 오라클 쿼리 실행 순서를 정리해둘까 한다.

 

▶ 오라클 쿼리 실행순서

① FROM

② ON

③ JOIN

④ WHERE

⑤ GROUP BY

⑥ CUBE | ROLLUP

⑦ HAVING

⑧ SELECT

⑨ DISTINCT

⑩ ORDER BY

⑪ TOP

 

ADP_HOUR 는 SELECT 절에서 선언한 별칭이기 때문에 GROUP BY , HAVING 절에서는 식별하지 못했던 것.

반면 마지막에 실행되는 ORDER BY 절에서는 사용 할 수 있었다

 

그럼 먼저 실행되는 HAVING 절에서 별칭을 부여하면 인식되나 실험해봤는데 안된다...ㅋㅋㅋ

별칭 부여는 SELECT절에서만 가능한가보다. 그래도 궁굼증 해결!!

 

4.실행결과