SQL 명령문, 특히 SELECT 문의 실행 순서는 우리가 작성하는 순서와는 다르게 DBMS 내부에서 정해진 논리적 순서로 실행됩니다. 이 순서를 이해하면 서브쿼리, 정렬, 필터링 등을 정확히 다룰 수 있습니다.
SELECT [열 목록]
FROM [테이블]
JOIN [다른 테이블]
ON [조인 조건]
WHERE [조건]
GROUP BY [그룹화 기준]
HAVING [그룹 조건]
ORDER BY [정렬 기준]
LIMIT [출력 개수 제한]
이건 우리가 작성하는 순서이고, 실제 DBMS가 처리하는 순서는 다릅니다!
| 순서 | 절 (Clause) | 역할 | 예시 |
| 1️⃣ | FROM | 어떤 테이블에서 데이터를 가져올지 결정 | FROM employees |
| 2️⃣ | JOIN / ON | 여러 테이블을 결합 (조인)하고 조건에 따라 연결 | JOIN departments ON employees.dept_id = departments.id |
| 3️⃣ | WHERE | 조건에 맞는 행(row) 을 필터링 | WHERE salary > 3000 |
| 4️⃣ | GROUP BY | 조건에 맞게 그룹(묶음) 생성 | GROUP BY dept_id |
| 5️⃣ | HAVING | 그룹에 대한 조건 필터링 | HAVING COUNT(*) > 5 |
| 6️⃣ | SELECT | 최종 출력할 열 선택 | SELECT dept_id, COUNT(*) |
| 7️⃣ | DISTINCT | 중복 제거 (필요할 경우) | SELECT DISTINCT job_title |
| 8️⃣ | ORDER BY | 정렬 (출력 결과의 순서 결정) | ORDER BY salary DESC |
| 9️⃣ | LIMIT | 결과 행 수 제한 (MySQL, PostgreSQL 등) | LIMIT 10 |
FROM
- 가장 먼저 실행
- 대상 테이블(또는 서브쿼리)을 선택하고 메모리에 로딩
- JOIN도 여기 포함됨
FROM employees
JOIN / ON
- 여러 테이블을 결합할 때 사용
- ON 조건을 통해 결합 기준을 지정
JOIN departments ON employees.dept_id = departments.id
GROUP BY
- 특정 컬럼을 기준으로 묶음(Grouping) 을 생성
- 이후 HAVING, COUNT(), AVG() 등의 집계 함수와 함께 사용
다음과 같은 employees 테이블이 있다고 하고,
예시: employees 테이블
| id | name | dept_id | salary |
| 1 | Alice | 10 | 3000 |
| 2 | Bob | 20 | 4000 |
| 3 | Charlie | 10 | 3200 |
| 4 | David | 30 | 5000 |
| 5 | Erin | 20 | 4200 |
| 6 | Frank | 10 | 3100 |
아래 코드와 같이 dept_id로 GROUP BY를 해주면,
SELECT dept_id, COUNT(*) AS emp_count, AVG(salary) AS avg_salary
FROM employees
GROUP BY dept_id;
다음과 같이 dept_id가 같은 데이터들끼리 묶어서 출력해준다.
| dept_id | emp_count | avg_salary |
| 10 | 3 | 3100.0 |
| 20 | 2 | 4100.0 |
| 30 | 1 | 5000.0 |
HAVING
- GROUP BY 후에 작동
- 각 그룹에 대해 조건을 걸어 필터링
- WHERE은 행 필터링, HAVING은 그룹 필터링
HAVING COUNT(*) > 5
SELECT
- 실제로 사용자에게 보여줄 컬럼(열)을 정의
- 이 시점에서 집계 함수 (SUM(), COUNT(), AVG() 등)도 계산
SELECT dept_id, COUNT(*) as cnt
DISTINCT
- 중복된 데이터를 제거함
- SELECT 절 바로 다음에서 실행됨
SELECT DISTINCT job_title
ORDER BY
- 최종 결과를 정렬
- SELECT 다음에 실행되므로, 정렬 기준에 별칭(alias)도 사용 가능
ORDER BY cnt DESC
LIMIT
- 출력할 행(row)의 수를 제한
- MySQL, PostgreSQL 등에서 사용 (Oracle은 ROWNUM, SQL Server는 TOP)
LIMIT 10
SELECT dept_id, COUNT(*) AS cnt
FROM employees
WHERE salary > 3000
GROUP BY dept_id
HAVING COUNT(*) > 5
ORDER BY cnt DESC
LIMIT 3;
위와 같은 코드가 있을 때, 실행 순서를 요약해보면,
- FROM employees → 테이블에서 전체 행 가져오기
- WHERE salary > 3000 → 조건에 맞는 행 필터링
- GROUP BY dept_id → 부서별로 그룹핑
- HAVING COUNT(*) > 5 → 그룹 중에서 조건에 맞는 것만
- SELECT dept_id, COUNT(*) → 결과에서 필요한 열 추출
- ORDER BY cnt DESC → 결과를 정렬
- LIMIT 3 → 상위 3개만 출력
'SQL' 카테고리의 다른 글
| 트랜잭션의 4가지 특징 (0) | 2025.05.12 |
|---|---|
| RDBMS (1) | 2025.05.09 |
| 데이터베이스에서 다양한 유형의 관계 (0) | 2025.05.08 |
| JOIN이란? 그리고 'INNER JOIN'과 'LEFT JOIN'의 차이점 (2) | 2025.05.07 |
| 정규화에 대하여 (4) | 2025.05.01 |