작성
·
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의 정상적인 동작 중 하나입니다.
질문에 도움이 되셨길 바라며, 학습에 있어서 더 궁금한 점이 있다면 언제든지 질문해주시기 바랍니다.