본문 바로가기
CS

CS 스터디 (DB) 13 - 쿼리 실행 순서는 어떻게 될까요?

by gentle-tiger 2025. 5. 20.

쿼리 실행 순서는 어떻게 될까요?

SELECT DISTICT o.state, COUNT(*)
FROM order o
INNER JOIN order_item oi ON oi.order_id = o.id
WHERE o.created_at BETWEEN '2024-01-01' and '2024-12-31'
GROUP BY o.state
HAVING COUNT(*) > 1000
ORDER BY o.state DESC
LIMIT 1

 

 

SQL 쿼리의 실행 순서는 논리적 처리 순서(Logical Query Order)를 따릅니다. 

논리적 실행 순서는 FROM, ON, JOIN  → WHERE, GROUP BY, HAVING →  SLEECT → DISTINCT → ORDER BY →  LIMIT 순서로 진행됩니다. 

 

SQL 쿼리의 실행 순서

1. FROM에서는 테이블 order o 와 order_item oi를 조인합니다. 이 단계에서는 o와 oi의 각레코드가 조건에 따라 병합됩니다. 즉 조인된 가상 테이블이 생성됩니다. 

 

2. WHERE에서는 필터링 조건을 적용합니다. order.created_at이 주어진 날짜 범위 내에 있는 레코드만 통과됩니다. 

 

3. GROUP BY에서는 o.state를 기준으로 그룹핑을 수행합니다. 

 

4. SELECT + COUNT(*)에서는 각 그룹에 대해 COUNT(*)를 집계합니다.  DISTINCT는 o.state의 중복을 제거하는 것이 아니라, SELECT 결과 행 전체의 중복을 제거합니다. 

하지만 이 경우  GROUP BY 자체가 각 o.state 별 하나의 결과만 반환하므로 DISTINCT는 불필요합니다. 

 

5. HAVING에서는 그룹핑된 결과에서 조건을 걸어 필터링합니다. 

 

6. ORDER BY에서는 그룹핑된 결과를 o.state 기준으로 내림차순 정렬합니다. 

 

7. LIMIT에서는 최종 결과에서 상위 1개의 행만 반환합니다. 

 

 

GROUP BY 와 DISTINCT의 차이 

- GROUP BY는 주어진 컬럼을 기준으로 데이터를 그룹화하여 각 그룹에 대해 집계 함수(COUNT, SUM, AVG 등)를 적용할 수 있게 해주는 반면, DISTINCT는 SELECT 절에서 반환되는 전체 컬럼 조합의 중복 행을 제거하는 데 사용됩니다.

- 즉, GROUP BY는 집계 목적에 사용되고 결과에 집계 함수가 포함되는 것이 일반적이며, DISTINCT는 단순히 중복 제거를 위해 사용되며 집계 함수 없이도 사용 가능합니다.

 

 

 

 

 

 

 

 

결론 

사용자가 SELECT 문을 가장 먼저 작성하지만, SQL 엔진은 FROM 절에서 테이블 결합과 필터링을 먼저 수행한 후, GROUP BY, HAVING, 그리고 마지막으로 SELECT, ORDER BY, LIMIT을 처리합니다. 이는 SQL이 선언적 언어이기 때문에, 문장의 작성 순서가 아니라 관계 대수 기반의 논리적 처리 순서에 따라 결과가 도출되기 때문입니다.