1. SQL 쿼리 작성 순서 (구문 순서)
코드를 타이핑할 때 사용하는 표준적인 문법 순서.
- SELECT : 조회할 컬럼 지정
- FROM : 조회할 테이블 지정 (+ JOIN)
- WHERE : 행을 필터링할 조건 지정
- GROUP BY : 특정 컬럼으로 그룹화
- HAVING : 그룹화된 결과에 대한 필터링 조건 지정
- ORDER BY : 결과 정렬 순서 지정
- LIMIT / OFFSET : 출력할 행의 개수 제한
2. SQL 쿼리 실제 실행 순서 (Logical Order)
컴퓨터(데이터베이스 엔진)가 데이터를 찾아오기 위해 내부적으로 처리하는 순서는 다음과 같다.
엔진이 쿼리를 파싱하고 실행할 때 데이터의 흐름(어디서 데이터를 가져와서, 어떻게 필터링되고 조작되는지, 어떤 모양으로 보여줄지)을 따라가기 때문에, 이 순서를 이해하면 쿼리 최적화(Tuning)나 디버깅에 큰 도움이 된다.
- FROM (+ JOIN)
- 가장 먼저 데이터베이스를 찾아가 실행된다.
- 데이터를 가져올 대상 테이블을 지정하고, 조인(JOIN)이 있다면 먼저 테이블을 합치는 작업을 통해 하나의 가상 테이블을 만듦. (ON 조건 평가)
- 테이블 별칭 부여 가능
- WHERE
- 개별 행(Row)에 대한 필터링 조건이 적용된다. FROM에서 가져온 데이터 중 조건에 맞는 행만 남김.
- 이 단계에서는 아직 그룹화나 집계가 되지 않았으므로, SUM(), AVG() 같은 집계 함수는 사용할 수 없음.
- GROUP BY
- 지정한 컬럼을 기준으로 데이터(위에서 걸러진 남은 행들)를 그룹화한다.
- HAVING
- 그룹화된 데이터에 대한 필터링 조건을 적용한다.
- WHERE절과 달리 여기서는 집계 함수 결과를 조건으로 사용할 수 있음. (집계 결과 필터)
- 예시: HAVING COUNT(*) > 5)
- 예시: HAVING COUNT(*) > 5)
- SELECT
- 최종적으로 화면에 출력할 컬럼을 선택한다.
- 계산식이나 가공(익명칭 부여, AS)도 이 단계에서 처리됨 (집계 함수 포함)
- DISTINCT
- SELECT된 결과에서 중복된 행을 제거.
- SELECT 이후이므로 ORDER BY는 SELECT 목록에 없는 컬럼 정렬이 제한됨
- ORDER BY
- 추출된 최종 결과 데이터를 특정 컬럼 기준으로 정렬한다.
- SELECT 단계 이후에 실행되기 때문에, SELECT 목록에 없는 컬럼 정렬이 제한됨
- SELECT에서 정의한 *별칭(Alias)을 정렬 조건으로 사용할 수 있음.
- 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)가 처리되는 과정이다.
'Language > sql' 카테고리의 다른 글
| 🗄️CASE문 문법 및 활용법 총정리 (Simple / Searched / SUM() 활용 / ORDER BY절에서의 사용) (0) | 2026.07.06 |
|---|---|
| 🗄️연관관계 매핑 전략과 핵심 개념(다대일, 일대다, 연관관계의 주인) (0) | 2026.07.02 |
| 🗄️서브쿼리 개념 종류 및 JOIN과의 차이점 완벽 정리 (0) | 2026.07.02 |
| 🗄️주요 JOIN의 종류 완벽 정리(Inner, Left, Cross, Self 등) (0) | 2026.07.02 |