작성
·
205
1
안녕하세요!
첫 번째 행에서 as cntID로 컬럼명을 정의한 내용은 결과값의 제목이 되는 컬럼명에만 영향을 미치는 건가요?
아래 작성한 코드처럼 having이나 order by절에서도 정의한 이름으로 사용했더니 에러 팝업이 떠서 질문드립니다!
select country, count(customerID) as cntID
from custmers
group by country
having count(cntID) >= 5
order by count(cntID) desc
답변 3
0
작성해주신 쿼리가 잘 돌아가네요 ㅎㅎ 다행입니다
+로 추가한 내용을 부연설명 드리자면 아래와 같아요.
(컴퓨터의 SQL 작업순서)
5 select ...
1 from ...
2 where ...
3 group by ...
4 having ...
6 order by ...
SQL은 위의 순서대로 실행을 하기 때문에, select에서 as로 설정한 부분은 group/having에선 원칙적으로 사용할 수 없다~ 였는데요, 위 처럼 실행이 되는 것으로 보아 해당 홈페이지에서 제공중인 SQL에서는 사용지원을 하는 것으로 보입니다. Oralce과 SQL 서버에서는 지원하지 않는다 하니 참고해주세요.
참고:
https://towardsdatascience.com/the-6-steps-of-a-sql-select-statement-process-b3696a49a642
https://stackoverflow.com/questions/3841295/sql-using-alias-in-group-by
So in Oracle and SQL Server, you cannot use a term in the GROUP BY clause that you define in the SELECT clause because the GROUP BY is executed before the SELECT clause.
There are exceptions though: MySQL and Postgres seem to have additional smartness that allows it.
0
아아 이해했습니다! 저는
customerID 를 cntID로 줄인다고 이해했는데,
count(customerID) 자체가 cntID였네요!
아래 코드처럼 돌려봐도 잘 됩니다.
select country, count(customerID) as cntID
from customers
group by country
having cntID >= 5
order by cntID desc
그럼 혹시 +로 댓글 추가 해주시기 전의 내용은 어떻게 이해하면 될까요...?! sql의 경우 지원이 된다고 보면 되는걸까요?
0
안녕하세요 민영님
간결하게 답변을 먼저드리면 SQL의 실행 순서때문에 as 예약어 설정은 원칙적으로는 order by 에서만 사용할 수 있는게 맞습니다.
select절이 실행되는게 group by와 having이 실행된 이후이거든요. as로 예약어가 설정이 되기 전이니 사용할 수가 없는게 원칙적으로는 맞는거죠.
하지만 이 부분은 DB종류에 따라 지원되는 유형이 다소 달라지는 것 같아요. 편의를 위해 실행순서는 select이 이후이지만 group by나 having에서 예약어를 사용할 수 있게해주는 DB도 있는 것이죠. 지금은 외부에 나와있어서 곧 자세한 설명도 추가로 달아두겠습니다. :)
+
앗 그런데 지금 다시보니....
order by는 count(cntID)로 넣어주셨는데요.
이 경우도 실행이 안됩니다. 의도하신것이 무엇일지 더 여쭤봐야겠지만 cntID desc나 혹은 count(customerID) desc가 의도하신 쿼리일까요? 한번 수정해보시고 의도대로 실행되는지 한번 확인해보시겠어요? ( having역시도 count(customerID) >= 5로 변경해보시면 좋을 것 같아요.)
위 쿼리에서 cntID는 count(customerID)를 의미하기 때문에 count(cntID)는 count(count(customerID))가 되어버려서 count가 중복되어요.
오오 그렇군요, 네 답변 감사합니다!