해결된 질문
작성
·
334
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
0
알려주신 사이트보니까 순서가 SELCET전에 HAVING이 작동하는거 같은데 Alias를 HAVING 절에서 어떻게 사용하는거죠?? (해당사진은 링크 걸어주신 마지막 사이트 사진입니다)
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를 사용해주셔야 합니다.
참고 하실 문서를 첨부하였으니 이해에 도움이 되길 바라겠습니다 :)
그 윗 줄을 봐주셔야해요! 도표는 SQL 표준에 대한 이야기고 MySQL 기준은 별도로 설명이 되어 있습니다.