본문 바로가기
computer science/데이터베이스

[데이터베이스] select문의 실행 순서

by 박연호의 개발 블로그 2020. 9. 5.

 

 

이번시간에는 select문이 내부적으로 어떤 순서로 실행되는지 알아보겠습니다.

 

select              - 5  

from                - 1

where             - 2

group by        - 3

having            - 4

order by         - 6

 

1. from

여기 적혀있는 테이블이 정말 존재하는 테이블인지 확인하고 select권한이 있는지도 확인합니다. select 권한이 없는데 select문을 날린 경우 db가 뱉는 에러가 semantic error이며 syntax erro는 오타, 쉼표가 있어야 하는 곳에 쉼표가 없는 경우 내뱉는 에러입니다. 그래서 from절을 체크해서 어떤 테이블을 액세스를 해야되는지를 확인합니다.

 

2. where

어떤 조건들이 있는지 확인하고 테이블에서 이 조건에 맞는 로우들을 가져옵니다.

 

3. group by

내가 가져온 로우들을 어떤 방식으로 group by할 것인지 결정합니다.

 

4. having

내가 가져온 로우들에서 조건을 검사하여 내가 어떤 데이터들을 버려야 하는지 결정합니다.

 

5. select

내가 가져온 로우중에서 어떤 컬럼들을 출력해야하는지 체크합니다. 여기서 일단 다 가져온 다음에 select하기 때문에 select * from ~한것이랑 select name from ~한 것이랑 사실상 io비용이 같다는 것입니다. 만약 select절에 있는 컬럼들이 모두 인덱스에 담겨 있다면 조금 다른겠지만 이 경우를 제외한 경우라면 드는 io비용은 같습니다.

 

6. order by

가져온 로우들을 기준에 맞춰 정렬합니다. 여기서 order by절이 select 절보다 더 늦게 수행되기 때문에 만약 select절에서 컬럼에 alias를 지정해놨을 경우에 group by에서 alias를 사용할 수 있습니다. 반면에 group by의 경우 select보다 먼저 수행되기 때문에 alias를 사용할 수 없습니다.