• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

set 1 - 2번 문제풀이

24.01.03 17:02 작성 조회수 106

0

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

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

실행 순서상

서브쿼리 ->

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

이지 않나요?

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

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.01.05

안녕하세요, 인프런 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의 정상적인 동작 중 하나입니다.

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