본문 바로가기
Language/sql

🗄️SQL 쿼리 작성 순서와 실행 순서

by 박수무당벌레 2026. 7. 2.

1. SQL 쿼리 작성 순서 (구문 순서)

코드를 타이핑할 때 사용하는 표준적인 문법 순서.

  1. SELECT : 조회할 컬럼 지정
  2. FROM : 조회할 테이블 지정 (+ JOIN)
  3. WHERE : 행을 필터링할 조건 지정
  4. GROUP BY : 특정 컬럼으로 그룹화
  5. HAVING : 그룹화된 결과에 대한 필터링 조건 지정
  6. ORDER BY : 결과 정렬 순서 지정
  7. LIMIT / OFFSET : 출력할 행의 개수 제한

2. SQL 쿼리 실제 실행 순서 (Logical Order)

컴퓨터(데이터베이스 엔진)가 데이터를 찾아오기 위해 내부적으로 처리하는 순서는 다음과 같다.

엔진이 쿼리를 파싱하고 실행할 때 데이터의 흐름(어디서 데이터를 가져와서, 어떻게 필터링되고 조작되는지, 어떤 모양으로 보여줄지)을 따라가기 때문에, 이 순서를 이해하면 쿼리 최적화(Tuning)나 디버깅에 큰 도움이 된다.

  1. FROM (+ JOIN)
    • 가장 먼저 데이터베이스를 찾아가 실행된다.
    • 데이터를 가져올 대상 테이블을 지정하고, 조인(JOIN)이 있다면 먼저 테이블을 합치는 작업을 통해 하나의 가상 테이블을 만듦. (ON 조건 평가)
    • 테이블 별칭 부여 가능
  2. WHERE
    • 개별 행(Row)에 대한 필터링 조건이 적용된다. FROM에서 가져온 데이터 중 조건에 맞는 행만 남김.
    • 이 단계에서는 아직 그룹화나 집계가 되지 않았으므로, SUM(), AVG() 같은 집계 함수는 사용할 수 없음.
  3. GROUP BY
    • 지정한 컬럼을 기준으로 데이터(위에서 걸러진 남은 행들)를 그룹화한다.
  4. HAVING
    • 그룹화된 데이터에 대한 필터링 조건을 적용한다.
    • WHERE절과 달리 여기서는 집계 함수 결과를 조건으로 사용할 수 있음. (집계 결과 필터)
      • 예시: HAVING COUNT(*) > 5)
  5. SELECT
    • 최종적으로 화면에 출력할 컬럼을 선택한다.
    • 계산식이나 가공(익명칭 부여, AS)도 이 단계에서 처리됨 (집계 함수 포함)
  6. DISTINCT
    • SELECT된 결과에서 중복된 행을 제거.
    • SELECT 이후이므로 ORDER BY는 SELECT 목록에 없는 컬럼 정렬이 제한됨
  7. ORDER BY
    • 추출된 최종 결과 데이터를 특정 컬럼 기준으로 정렬한다.
    • SELECT 단계 이후에 실행되기 때문에, SELECT 목록에 없는 컬럼 정렬이 제한됨
      • SELECT에서 정의한 *별칭(Alias)을 정렬 조건으로 사용할 수 있음.
  8. LIMIT / OFFSET
    • 정렬까지 완료된 최종 결과물에서 몇 개의 행을 보여줄지 결정 & 반환.
더보기

✨ 주의해야 할 점 (실행 순서의 중요성)

 

1) WHERE 절에서 SELECT 절의 별칭(Alias)을 사용할 수 없는 이유

  • 실행 순서상 WHERE가 SELECT보다 훨씬 먼저 실행된다.
  • 따라서 SELECT에서 SELECT user_id AS id라고 별칭을 붙여도, WHERE id = 'admin'이라고 쓰면 데이터베이스는 아직 id가 무엇인지 모르는 상태이기 때문에 에러가 발생. (별칭이 바뀌기 전 실행으로 인함)

2) ORDER BY 절에서는 SELECT 절의 별칭(Alias)을 사용할 수 있는 이유

  • ORDER BY는 SELECT보다 나중에 실행된다.
  • 따라서 SELECT에서 정의한 별칭을 정렬할 때 (ORDER BY id DESC) 문제없이 사용할 수 있음.

3) 그 외 내용 정리

  • SELECT에서 부여된 별칭은 이후에 실행되는 절에서 사용할 수 있다. (MySQL에선 GROUP BY절도 허용)
  • GROUP BY 이전에 WHERE 절이 실행되므로 집계 결과 필터는 HAVING에서 써야한다

3. 작성 순서 vs 실행 순서 비교

  작성 문법 순서 (Syntactic) 데이터베이스 내부 실행 순서
(Logical/Execution)
실제 처리하는 역할 (실행 순서)
1 SELECT (+ DISTINCT) FROM (+ JOIN) 데이터를 가져올 대상 테이블 지정 및 병합
(테이블 읽기 ▶️ Cartesian product ▶️ 조인 조건으로 행 결합)
2 FROM WHERE 개별 행(Row) 수준 조건 필터링
3 WHERE GROUP BY [Split] 특정 컬럼 기준 데이터 그룹화(쪼갬)
4 GROUP BY HAVING 그룹화된 데이터 조건 필터링
5 HAVING SELECT [Apply/Combine] 최종 출력할 컬럼 선택 및 가공 (별칭 부여)
6 ORDER BY DISTINCT 중복된 행 제거
7 LIMIT / OFFSET ORDER BY 최종 결과 데이터 정렬
8 - LIMIT / OFFSET 출력할 행의 개수 제한 및 반환
💡 Split - Apply - Combine (분할 - 적용 - 결합) 전략은 SQL 실행 순서에서 GROUP BY와 집계 함수(Aggregate Function)가 처리되는 과정이다.