Rev Notebook

[프로그래머스] SQL Lv.3 - 조건에 맞는 사용자와 총 거래금액 조회하기

by Rev_

GROUP BY - HAVING 절을 이용하는 비교적 어렵진 않는 문제였다.

-- 완료된 중고 거래의 총금액이 70만원 이상인 사람
-- 총거래금액을 기준으로 오름차순 정렬
-- 회원ID, 닉네임, 총거래금액 조회
SELECT T1.USER_ID, T1.NICKNAME, SUM(T2.PRICE) AS TOTAL_SALES
FROM USED_GOODS_USER T1
INNER JOIN USED_GOODS_BOARD T2
ON T1.USER_ID = T2.WRITER_ID
WHERE T2.STATUS = 'DONE'
GROUP BY T1.USER_ID, T1.NICKNAME
HAVING SUM(T2.PRICE) >= 700000 -- HAVING절에는 집계함수 사용 가능 !
ORDER BY SUM(T2.PRICE) -- ORDER BY절에도 집계함수 사용 가능

집계함수 사용에는 은근 제한이 있기 때문에

HAVING절이랑 ORDER BY절에서 집계 함수 사용이 되나 ....? 하고 생각을 했는데, HAVING절에서야 당연히 되어야 할 것 같고, ORDER BY절에서도 사용을 할 수 있구나 싶었다.

이 개념을 알려면 쿼리의 실행 순서를 안다면 편리할 것 같다 !

 

쿼리의 실행 순서

쿼리의 실행순서는 FROM(+JOIN) - WHERE - GROUP BY - HAVING - SELECT - ORDER BY

SELECT T1.USER_ID, T1.NICKNAME, SUM(T2.PRICE) AS TOTAL_SALES
FROM USED_GOODS_USER T1
INNER JOIN USED_GOODS_BOARD T2
ON T1.USER_ID = T2.WRITER_ID
WHERE T2.STATUS = 'DONE'
GROUP BY T1.USER_ID, T1.NICKNAME
HAVING SUM(T2.PRICE) >= 700000
ORDER BY TOTAL_SALES

해당 실행순서를 이용한다면 ORDER BY절에서 ALIAS를 사용할 수 있다는 것도 알 수 있다.

SELECT절은 GROUP BY와 HAVING절 이후에 실행되기 때문에

HAVING절에서 TOTAL_SALES 약어를 사용하게 된다면 에러가 난다고 생각했는데,

어째 Oracle에서는 HAVING절에 약어를 쓰면 에러가 나고, MySQL에서는 약어를 쓸 수 있다 .... ?

왜지 .....? 

실행순서는 다 같은 거 아니었나요 ....

 

내일 한 번 다시 봐야할 것 같습니당

 

블로그의 정보

Hi Rev

Rev_

활동하기