• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

alias 질문

21.03.19 13:02 작성 조회수 187

0

강사님 안녕하세요.

SELECT salary * months as earnings, COUNT(salary * months)

FROM EMPLOYEE

GROUP BY salary * months 

HAVING MAX(earnings)

라는 쿼리를 작성했는데요,

이 쿼리가 에러 없이 돌아가서 놀랐습니다. (답은 틀렸지만요!)

SELECT절에서 정의한 alias를 HAVING 절에서 먼저 썼는데 돌아가더라고요.

1. FROM > WHERE  > GROUP BY > HAVING > SELECT > ORDER BY 순으로 실행되니 SELECT에서 정의된 alias는 ORDER BY에서만 사용 가능한 것 아닌가요??

왜 SELECT 이전인 HAVING에서도 부를 수 있나요?

MYSQL 공식 문서에서도

 You can use the alias in GROUP BYORDER BY, or HAVING clauses to refer to the column:

라고 되어있는데 실행 순서와 반대 아닌가용? 

2. WHERE 서브쿼리를 사용해 아래와 같이 쿼리 적었습니다.

실행 순서때문에 GROUP BY에서 부를 수 있는 경우는 FROM 서브쿼리를 썼을때 뿐이라고 생각했는데요,

SELECT months * salary AS earnings, COUNT(*) 

FROM employee

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

GROUP BY  earnings

위처럼 FROM 서브쿼리 없이 group by에 적용된 alias가 잘 돌아가니 다시 헷갈려집니더 ㅠ_ㅠ 왜 그런건가요?

3. 컬럼명 alias는 SELECT에서만 새로 지정할 수 있는지요? GROUP BY ~~ AS a 라거나 HAVING ~~ AS a 도 가능한가요?

4. GROUP BY에서 alias를 쓰고자, FROM 서브쿼리를 써서 다음 쿼리를 새로 작성했습니다.

SELECT earnings, COUNT(salary * months)

FROM (SELECT salary * months AS earnings FROM employee) employees

GROUP BY earnings 

ORDER BY earnings DESC

LIMIT 1

  • ERROR 1054 (42S22) at line 1: Unknown column 'salary' in 'field list'

라는 오류가 떠서요 ㅠㅠ 

문제 없는 것  같은데 간혹 unknown column 이라는 오류가 나면 어디를 수정해야 하는지 막막합니다.

도와주세요!

답변 1

답변을 작성해보세요.

0

안녕하세요 miji.lee님

1,2번 질문과 관련해서는 이해하고 계신 부분이 맞습니다

이부분은 확답드리기 어렵지만 아마도 해커랭크 사이트에서 SQL 쿼리 실행용으로 사용되는 인터프리터의 특정 버전에서 예외 경우를 처리하는 것이 아닐까 짐작이 되는데요. 해커랭크 내부적으로 어떤 인터프리터를 사용하고 있는지를 정확하게 알기가 어려워서 정확한 답변을 드리지 못해 죄송합니다.

현업에서도 각 회사에서 사용하는 툴마다, 또 버전마다 세부적으로 실행 가능한 문법이 조금씩 달라지기 때문에 이런 경우도 있다는 걸 이해하고만 넘어가시면 좋을 것같습니다.

3. alias는 GROUP BY와 HAVING에서는 사용할 수 없습니다.

4. 에러 메세지 그대로 salary라는 컬럼이 없기 때문에 발생하는 오류입니다.

----

SELECT earnings, COUNT(salary * months)
--> 여기서 salary라는 컬럼 데이터를 불러오라고 명령하셨는데요.

FROM (SELECT salary * months AS earnings FROM employee) employees
--> 서브쿼리 결과물인 employees 테이블에서 반환되는 컬럼은 earnings 한개 밖에 없습니다.

GROUP BY earnings
ORDER BY earnings DESC
LIMIT 1

----

COUNT(salary * months)를 COUNT(*) 또는 COUNT(earnings)로 변경해주시면 정답 확인하실 수 있을거에요.

궁금증이 해결되셨길 바랍니다 :)