[MySQL] group by에서 select 절의 alias를 사용할 수 있나? 인덱스는?

kiki·2024년 9월 13일
0

기본기

목록 보기
8/8

코테 연습을 하다가 갑작스레 궁금해졌다.

group by절은 select보다 먼저 실행되는데 어떻게 alias를 사용해도 되지?

대답은,, mysql에서 가능한 것이라고 한다. 즉 DBMS가 알아서 처리해준다는 말씀

사실 내가 궁금했던건 따로 있는데,
바로 group by 1과 같이 컬럼 이름이나 alias가 아닌 인덱스를 사용해도 실행 순서에 의한 문제가 없는지였다.
나는 인덱스도 별칭이라고 착각하고 있었는데, 챗 지피티에게 질문해보니 차이를 알 수 있었다

챗 지피티 답변

좋은 질문이에요! 원칙적으로는 GROUP BY 절이 SELECT 절보다 먼저 실행되기 때문에, SELECT 절의 별칭(alias)은 GROUP BY 절에서 사용할 수 없습니다. 그런데 GROUP BY에서 숫자를 사용하는 것은 조금 다른 경우입니다. 이 경우는 SQL 쿼리의 실행 순서와는 상관이 없습니다.

왜 GROUP BY에서 숫자를 사용하는 것이 가능한가?
GROUP BY 1과 같은 구문은 별칭(alias)을 사용하는 것이 아니라, SELECT 절에서의 열의 위치를 참조하는 것입니다. SQL은 GROUP BY 절을 해석할 때 SELECT 절의 열 위치를 먼저 파악하고, 그 위치에 해당하는 실제 열을 사용하여 그룹화를 수행합니다.

즉, GROUP BY 1이라고 쓰면, SQL 쿼리 엔진은 SELECT 절의 첫 번째 열을 기준으로 그룹화하라는 의미로 해석합니다. 이 과정은 SQL 엔진 내부에서 실행 순서와는 별도로 동작하며, 열의 이름이나 별칭을 사용하지 않고, 단순히 열의 순서를 참조하는 것입니다.

실행 순서와 무관한 이유
SQL 쿼리의 일반적인 실행 순서는 다음과 같습니다:

FROM 절에서 테이블이나 데이터를 가져옴
WHERE 절을 평가하여 필터링
GROUP BY 절로 그룹화
그룹화된 결과에 대해 HAVING 절을 평가
SELECT 절에서 최종적으로 열을 선택
ORDER BY 절로 결과 정렬

이 순서에 따르면 GROUP BY가 SELECT보다 먼저 실행되지만, GROUP BY 1에서의 1은 SELECT 절의 첫 번째 열을 참조하기 때문에, SELECT 절의 정의 자체가 아닌, 열의 위치를 기준으로 참조하는 것이므로 실행 순서와는 무관하게 동작합니다.

결론
GROUP BY 1과 같은 구문이 가능한 이유는, SQL 쿼리 엔진이 GROUP BY 절을 해석할 때 SELECT 절에서 열의 위치를 참조하기 때문입니다. 이 방식은 실행 순서와는 무관하게 열의 순서를 참조하는 것이므로 별칭(alias)이 아닌, 위치(index)로 그룹화할 수 있는 것입니다.


즉 단순히 말하자면 alias는 select가 실행 되어 반환할 열을 선택하고 별칭이 지정되는 것이지만, 인덱스는 단순히 열의 위치를 기준으로 참조하는 것이므로 sql 실행 순서와 무관하다는 것이다.

근데 만약 해당 인덱스에서 함수가 사용되었다면?

select count(id) as fish_count, month(time) as month
from fish_info
group by 2
order by 2;

위 쿼리와 같이 MONTH로 함수가 사용된 열의 인덱스를 사용해 그룹화를 하고자 한다면 오류가 날까?

안난다.

이 또한 sql 자체에서 먼저 함수를 실행한 후 그룹화가 진행된다고 한다.
(chat gpt 曰: sql엔진이 select 절의 열을 먼저 평가한 후 그 결과를 기반으로 그룹화 진행)

즉 ~

  • alias는 별칭(as ~)을 의미하고 인덱스는 select절의 열 위치를 의미함
  • alias는 select가 실행될 때 지정된다.
  • alias는 select가 group by보다 늦게 실행되므로 원래는 group by에서 사용할 수 없다. (하지만 mysql에서는 DBMS의 처리로 사용 가능함)
  • group by에서 인덱스의 사용은 단순히 열의 위치를 기준으로 열을 참조하는 것이므로 sql실행 순서와 무관함
  • SQL 엔진은 GROUP BY 절에서 인덱스를 사용할 때, 그 위치의 열을 먼저 계산하고, 이를 바탕으로 그룹화를 수행

참고

https://jaehoney.tistory.com/191 (실행 순서 이미지 참고)

0개의 댓글