SQL

SQL 명령문의 실행순서

euicheol0910 2025. 5. 12. 02:53

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;

 

위와 같은 코드가 있을 때, 실행 순서를 요약해보면,

 

  1. FROM employees → 테이블에서 전체 행 가져오기
  2. WHERE salary > 3000 → 조건에 맞는 행 필터링
  3. GROUP BY dept_id → 부서별로 그룹핑
  4. HAVING COUNT(*) > 5 → 그룹 중에서 조건에 맞는 것만
  5. SELECT dept_id, COUNT(*) → 결과에서 필요한 열 추출
  6. ORDER BY cnt DESC → 결과를 정렬
  7. 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