본문 바로가기

SQL

Having에 Select의 Alias(별칭)을 쓸 수 있다니..

최근에 프로그래머스에  "특정 기간동안 대여 가능한 자동차들의 대여비용 구하기" 를 풀면서 SQL 문법에 의문점이 하나 생겼습니다.

https://school.programmers.co.kr/learn/courses/30/lessons/157339

 

프로그래머스

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

programmers.co.kr

 

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

 

MySQL :: MySQL 8.0 Reference Manual :: B.3.4.4 Problems with Column Aliases

B.3.4.4 Problems with Column Aliases An alias can be used in a query select list to give a column a different name. You can use the alias in GROUP BY, ORDER BY, or HAVING clauses to refer to the column: SELECT SQRT(a*b) AS root FROM tbl_name GROUP BY root

dev.mysql.com

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 

 

ALIAS is not allowed in HAVING clause, GROUP BY and WHERE clause. Allowed in ORDER BY – 1Z0-061 Oracle SQL

From first glance, this subquery looks absolutely legit. Unfortunately, it won’t work as a subquery but will work as a standalone query. […]

1z0-061.korobko.pro

해당 포스팅에서 GROUP BY같이 SELECT절 이전 연산에서 별칭을 쓰면 에러 발생하는걸 볼 수있습니다. 그런데 최근에 오라클 공식 문서에 따르면 

 

https://oracle-base.com/articles/23c/group-by-and-having-clause-using-column-alias-or-column-position-23c

 

GROUP BY and HAVING Clauses Using Column Aliases in Oracle Database 23c

From Oracle 23c onward we can use the column alias in GROUP BY and HAVING clauses, or the column position in the GROUP BY clause.

oracle-base.com

 

 

Oracle 23c 이후에는 GROUP BY 및 HAVING , GROUP BY 절의 별칭을 사용할 수 있도록 허용한거같습니다.

 

그래서 데이터베이스나 버전에 따라서 문법 경우가 다를 수 있으니 확인해보고 해봐야될거같습니다.