최근에 프로그래머스에 "특정 기간동안 대여 가능한 자동차들의 대여비용 구하기" 를 풀면서 SQL 문법에 의문점이 하나 생겼습니다.
https://school.programmers.co.kr/learn/courses/30/lessons/157339
SELECT CAR_ID , CAR_TYPE , ROUND (DAILY_FEE * 30 * ( 100 - DISCOUNT_RATE) / 100) AS FEE
FROM CAR_RENTAL_COMPANY_CAR INNER JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN
USING (CAR_TYPE)
WHERE DURATION_TYPE = "30일 이상" AND CAR_TYPE IN ("세단","SUV")
AND CAR_ID NOT IN (
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE_FORMAT(START_DATE,"%Y-%m-%d") <= "2022-11-30" AND DATE_FORMAT(END_DATE,"%Y-%m-%d") >= "2022-11-01"
)
HAVING FEE >= 500000 && FEE < 2000000
ORDER BY FEE DESC , CAR_TYPE , CAR_ID DESC
위의 쿼리를 보면 SELECT절에서 쓴 별칭을 HAVING절에 썼는데 정답 처리로 인정이되는걸 발견했습니다..
제가 아는 SQL 실행 순서가..이러한데..
FROM and JOIN -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY -> LIMIT
WHERE절에 SELECT 별칭을 쓰면 SELECT절 보다 WHERE절이 먼저 실행되기때문에 에러가 발생하는것인데... HAVING절도 SELECT 이전에 수행되기때문에 에러가 발생해야되는게 아닌지.. 왜 쓸 수 있는건지 궁금해졌습니다.
찾아보니, 표준 SQL에서는 지원되지 않지만 데이터베이스 종류나 버전에 따라 다를 수 있다고 합니다.
Mysql 같은 경우에는
https://dev.mysql.com/doc/refman/8.0/en/problems-with-alias.html
GROUP BY, ORDER BY 또는 HAVING 절의 별칭을 사용할 수 있다고 나와있습니다. 하지만 WHERE절에서는 허용하지 않는다고 나와있네요. WHERE절 같은 경우에는 별칭을 쓴 컬럼이 아직 선택되지 않아 제한된다고 합니다.
또 오라클 같은 경우
https://1z0-061.korobko.pro/?p=753
해당 포스팅에서 GROUP BY같이 SELECT절 이전 연산에서 별칭을 쓰면 에러 발생하는걸 볼 수있습니다. 그런데 최근에 오라클 공식 문서에 따르면
Oracle 23c 이후에는 GROUP BY 및 HAVING , GROUP BY 절의 별칭을 사용할 수 있도록 허용한거같습니다.
그래서 데이터베이스나 버전에 따라서 문법 경우가 다를 수 있으니 확인해보고 해봐야될거같습니다.
'SQL' 카테고리의 다른 글
프로그래머스 SQL 고득점 Kit 풀이 - JOIN 편 (0) | 2023.05.26 |
---|---|
프로그래머스 SQL 고득점 Kit - IS NULL 편 (0) | 2023.05.19 |
프로그래머스 SQL 고득점 Kit 풀이 - SUM, MAX, MIN 편 (0) | 2023.05.11 |
프로그래머스 SQL 고득점 Kit 풀이 - SELECT 편 (0) | 2023.05.03 |