본문 바로가기

CS/데이터베이스

[DB] SELECT 문장 처리 순서

이 글은 데이터베이스 스터디 중 학습한 내용을 정리한 것입니다.

 


 

 

SELECT DISTINCT column, AGG_FUNC(column_or_expression), …
FROM mytable
    JOIN another_table
      ON mytable.column = another_table.column
    WHERE constraint_expression
    GROUP BY column
    HAVING constraint_expression
    ORDER BY column ASC/DESC
    LIMIT count;

 

 위와 같은 쿼리문을 예시로 들겠다. 위 쿼리에서 각 절은 아래의 순서로 실행된다.

 

1. FROM & JOIN

 FROM절과 JOIN절이 가장 첫번째로 실행되며, 수행되어야 할 데이터 셋을 결정한다. 만약 FROM & JOIN에 서브쿼리가 존재한다면, 서브쿼리도 함께 실행된다.

 

2. WHERE

 데이테 셋이 결정된 이후, 각각의 튜플에 대해 조건에 부합하는 확인하는 작업을 WHERE에서 수행한다. WHERE 절에서 유의할 점은, SELECT 절에서 지정한 별칭이, WHERE에서 적용되지 않는다는 것이다. WHERE 절이 실행될 때는 SELECT 절이 실행되기 전이기 때문이다.

 

3. GROUP BY

 WHERE 절이 실행된 이후 걸러진 튜플들에 대해 GROUP BY 절이 수행된다. GROUP BY 절에 명시된 컬럼들을 기준으로 각 튜플들은 그룹화된다. GROUP BY를 사용한다는 것은, 암묵적으로 GROUP BY 절 적용전 튜플이 아닌, 그룹화된 데이터에 대해 집계 함수가 적용될 예정이라는 것을 의미한다.

 

4. HAVING

 쿼리에 GROUP BY 절이 있을 경우, HAVING 절을 사용하여 그룹화된 데이터들에 대한 필터링을 수행할 수 있다. WHERE 절과 마찬가지로 별칭을 사용하지 못한다.

 

5. SELECT

 SELECT 절에 있는 모든 표현식이 최종적으로 계산된다.

 

6. DISTINCT

 남아있는 튜플들에 대해, 컬럼에 중복된 값을 가지고 있는 튜플은 제외된다.

 

7. ORDER BY

 ORDER BY 절에 명시된 ASC or DESC에 의해 데이터가 정렬된다. ORDER BY는 SELECT 절이 실행된 이후 실행되기 때문에, 별칭을 사용할 수 있다.

 

8. LIMIT

 최종적으로 남은 튜플들에 대해 LIMIT 에 지정된 범위 내에서의 튜플만 쿼리의 결과로 반환된다.

 

 

 

 

참고자료

 

SQLBolt - Learn SQL - SQL Lesson 12: Order of execution of a Query

Now that we have an idea of all the parts of a query, we can now talk about how they all fit together in the context of a complete query. Complete SELECT query SELECT DISTINCT column, AGG_FUNC(column_or_expression), … FROM mytable JOIN another_table ON m

sqlbolt.com

 

'CS > 데이터베이스' 카테고리의 다른 글

[DB] Real MySQL 8.0 - 4.2 InnoDB 스토리지 엔진 아키텍처  (2) 2024.01.22
[DB] SQL 질문 정리  (0) 2024.01.18
[DB] SQL -DDL  (0) 2024.01.17
[DB] SQL 개요  (0) 2024.01.17
[DB] Real MySQL 8.0 - 4.1 MySQL 아키텍처  (0) 2024.01.12