인프런 커뮤니티 질문&답변

코린이님의 프로필 이미지
코린이

작성한 질문수

[백문이불여일타] 데이터 분석을 위한 고급 SQL 문제풀이

2번 문제 풀이

set 1 - 2번 문제풀이

작성

·

182

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

having total_score !=0 이라고 group by 결과값을 필터링해주셨는데

실행 순서상

서브쿼리 ->

메인쿼리(from/join -> (where) -> groupby -> having ->select -> orderby -> limit)

이지 않나요?

그런데 select 에 있는 total_score를 having에서 쓸 수 있는 이유가 궁금합니다.

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

코린이님 질문주신 SQL의 실행 순서와 관련한 내용에 대해 답변드리겠습니다.

말씀하신 대로 일반적으로 SQL 쿼리의 실행 순서는 서브쿼리를 포함하여 다음과 같습니다:
1. FROM / JOIN
2. WHERE
3. GROUP BY
4. HAVING
5. SELECT
6. ORDER BY
7. LIMIT

그런데 여기서 중요한 점은 SELECT 단계에서 정의된 별칭(alias)이나, 계산된 컬럼(expression)은 HAVING 절에서 사용할 수 있다는 것입니다. 이는 HAVING 절이 GROUP BY 이후에 수행되기 때문입니다.

예를 들어, SELECT 절에서 total_score라는 이름으로 합계나 평균 같은 집계 함수를 통해 값을 계산했다고 하면, 이미 그룹화된 후에 나오는 결과값이기 때문에 HAVING 절에서 해당 값에 기반하여 필터링을 할 수 있습니다. 간단히 말해, HAVING은 그룹화된 결과에 대한 조건을 명시할 때 사용하는 것이며, 이때 GROUP BY에 의해 그룹화된 후 컬럼에 대한 집계함수를 적용한 결과를 사용할 수 있기 때문입니다.

따라서 HAVING 절에서는 GROUP BY로 인해 그룹화된 이후에 만들어진 total_score 같은 집계 결과를 사용하여 필터링을 할 수 있는 것입니다. SELECT 절에서 정의한 집계 컬럼을 HAVING에서 사용하는 것은 SQL의 정상적인 동작 중 하나입니다.

질문에 도움이 되셨길 바라며, 학습에 있어서 더 궁금한 점이 있다면 언제든지 질문해주시기 바랍니다.

코린이님의 프로필 이미지
코린이

작성한 질문수

질문하기