• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    해결됨

해커랭크 Top Earners 문제 답답합니다 ㅜㅜ

22.05.12 22:06 작성 조회수 223

2

변수 명명이 헷깔립니다.

1.

WHERE절에 서브쿼리를 할때

 

SELECT  months*salary , count(*)

FROM Employee

WHERE months*salary = (SELECT MAX(months *salary) FROM Employee)

GROUP BY months*salary

 

이렇게 months*salary를 따로 명명해주지 않아도 잘 돌아갑니다.

그런데 

 

SELECT  months*salary AS earnings, count(*)

FROM Employee

WHERE earnings = (SELECT MAX(months *salary) FROM Employee)

GROUP BY earnings

 

이런식으로 WHERE과 GROUP BY에 earnings라고 명명한 변수를 쓰면 에러가 납니다. 그 이유를 모르겠습니다.

 

 

2. 그런데 HAVING 절에 서브쿼리를 쓰는 경우는 이와 반대가 됩니다.

 

SELECT  months*salary AS earnings, count(*)

FROM Employee

GROUP BY earnings

HAVING earnings = (SELECT MAX(months*salary) FROM Employee)

이렇게 GROUP BY와 HAVING에 earnings라고 명명한 변수를 주면 잘 돌아갑니다.

 

그런데  

 

SELECT  months*salary , count(*)

FROM Employee

GROUP BY months*salary

HAVING months*salary = (SELECT MAX(months*salary) FROM Employee)

 

이렇게 이름을 따로 명명해주지 않으면 안돌아갑니다. 

명명부분이 너무 어렵습니다ㅜㅜ 도와주세요

답변 3

·

답변을 작성해보세요.

0

민석님의 프로필

민석

질문자

2022.05.13

구글링했을때 대부분 mysql도 having이 select보다 먼저라고 되어있는데 블로그 글들이 틀린거군요....

답변 감사합니다!

0

민석님의 프로필

민석

질문자

2022.05.13

알려주신  사이트보니까 순서가 SELCET전에 HAVING이 작동하는거 같은데 Alias를 HAVING 절에서 어떻게 사용하는거죠?? (해당사진은 링크 걸어주신 마지막 사이트 사진입니다)

그 윗 줄을 봐주셔야해요! 도표는 SQL 표준에 대한 이야기고 MySQL 기준은 별도로 설명이 되어 있습니다.

0

안녕하세요, 답변 드립니다.

우선 MySQL 에서는 GROUP BY, HAVING, ORDER BY 절에서 Alias 를 사용하실 수 있고 WHERE 절에서는 사용하실 수 없습니다. WHERE 절에서 사용할 수 없는 이유는 쿼리 실행 순서와 관련이 있는데요, WHERE 절이 실행된 이후에 SELECT 절이 실행되기 때문에 SELECT 절에서 정의한 Alias는 WHERE 절에서 사용할 수 없습니다.

MySQL에서는 SQL 표준 문법과 다르게, HAVING 절이 FROM (JOIN), WHERE, GROUP BY, SELECT 이후에 실행됩니다. 따라서 HAVING 절에서는 SELECT 절에서 정의한 Alias를 사용해주셔야 합니다.

참고 하실 문서를 첨부하였으니 이해에 도움이 되길 바라겠습니다 :)