SQL 절 실행 순서 정리

TJK·2025년 8월 22일
0

SQL 절 실행 순서 정리

SQL 쿼리는 작성된 순서와 실제 실행되는 순서가 다릅니다. 이 실행 순서를 이해하는 것이 복잡한 쿼리를 작성하고 결과를 예측하는 데 필수적입니다.

SQL 실행 순서 (★★★★★ 필암기)

  1. FROM: 데이터를 가져올 테이블 지정. JOIN 처리
  2. WHERE: 행(Row) 단위 조건 필터링
  3. GROUP BY: 행들을 그룹화
  4. HAVING: 그룹별 조건 필터링
  5. SELECT: 최종 결과로 출력할 컬럼 지정
  6. ORDER BY: 결과 정렬
  7. LIMIT/ROWNUM: 최종 결과 개수 제한

1. FROM (출발지)

  • 역할: 쿼리가 사용할 모든 데이터의 원천을 결정합니다.
  • 특징: JOIN이 이 단계에서 모두 처리되어 임시 테이블이 생성됩니다.
  • 시험 팁: JOIN과 관련된 모든 동작은 이 단계에서 시작됩니다.

2. WHERE (그룹핑 전 필터링)

  • 역할: FROM 절에서 만들어진 임시 테이블의 개별 행(Row)에 조건을 적용해 필터링합니다.
  • 특징:
    • 집계 함수(SUM, AVG, COUNT)는 사용할 수 없습니다. (그룹핑 전이므로)
    • SELECT 절에 정의된 컬럼 별칭을 사용할 수 없습니다. (실행 순서상 SELECT보다 앞서기 때문)
  • 시험 팁: WHERE에 집계 함수가 있으면 무조건 오답!

3. GROUP BY (그룹화)

  • 역할: 특정 컬럼을 기준으로 같은 값을 가진 행들을 하나의 그룹으로 묶습니다.
  • 특징: SELECT 절에 집계 함수와 함께 사용되어야 의미가 있습니다.

4. HAVING (그룹핑 후 필터링)

  • 역할: GROUP BY로 그룹화된 결과에 대해 조건을 적용해 필터링합니다.
  • 특징:
    • WHERE와 달리 집계 함수를 사용할 수 있습니다.
    • GROUP BY 절이 없을 경우 SELECT 절의 모든 행을 하나의 그룹으로 간주합니다.
  • 시험 팁: '그룹에 대한 조건' 이라는 표현이 나오면 무조건 HAVING입니다.

5. SELECT (최종 결과 선택)

  • 역할: 앞선 절들을 통해 필터링, 그룹화된 결과에서 최종적으로 사용자에게 보여줄 컬럼을 선택합니다.
  • 특징:
    • 쿼리문 작성 시 가장 먼저 쓰지만, 실행 순서상 FROM, WHERE, GROUP BY, HAVING 다음에 실행됩니다.
    • AS를 사용해 컬럼에 별칭을 부여할 수 있습니다.

6. ORDER BY (최종 정렬)

  • 역할: 최종 결과를 특정 컬럼을 기준으로 정렬합니다.
  • 특징:
    • 모든 연산이 끝난 후 가장 마지막에 가까운 단계에서 실행됩니다.
    • SELECT 절에서 부여된 별칭을 사용할 수 있습니다. (실행 순서상 SELECT보다 뒤에 있기 때문)
  • 시험 팁: 별칭 사용 가능 여부가 자주 출제됩니다.

7. LIMIT / ROWNUM (결과 개수 제한)

  • 역할: 최종 결과에서 원하는 개수만큼만 가져옵니다.
  • 특징:
    • LIMIT (MySQL/PostgreSQL 등): ORDER BY 이후에 실행되어 정렬된 결과에서 상위 N개를 가져옵니다.
    • ROWNUM (Oracle): ORDER BY 이전에 임시로 번호가 매겨집니다. 따라서 정렬된 결과에 대한 상위 N개를 얻으려면 반드시 서브쿼리를 사용해야 합니다.
  • 시험 팁: Oracle ROWNUM의 특수성(정렬 전 실행)을 묻는 문제가 자주 나옵니다.

핵심 포인트 정리 (★★★★★)

  1. 실행 순서: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT를 반드시 암기하세요.
  2. WHERE vs HAVING:
    • WHERE: 필터링, 집계 함수 사용 불가.
    • HAVING: 그룹 필터링, 집계 함수 사용 가능.
  3. ORDER BY와 별칭: SELECT 절의 별칭은 ORDER BY에서만 사용 가능합니다.
  4. Oracle ROWNUM: ORDER BY보다 먼저 실행되므로, TOP-N 쿼리는 반드시 서브쿼리를 활용해야 합니다.

실전 기출 문제 스타일

1. 다음 중 SQL 실행 순서가 올바른 것은?
① SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY
② FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
③ FROM → GROUP BY → WHERE → HAVING → SELECT → ORDER BY
④ SELECT → FROM → GROUP BY → HAVING → WHERE → ORDER BY

2. HAVING 절에만 쓸 수 있는 것은?
① 일반 컬럼 조건
② 집계 함수 조건
③ 서브쿼리 결과
④ 별칭

3. Oracle에서 상위 5명의 급여를 기준으로 정렬하여 조회하는 쿼리 중 올바른 것은?
SELECT * FROM Employee WHERE ROWNUM <= 5 ORDER BY sal DESC;
SELECT * FROM Employee ORDER BY sal DESC WHERE ROWNUM <= 5;
SELECT * FROM (SELECT * FROM Employee ORDER BY sal DESC) WHERE ROWNUM <= 5;
SELECT * FROM (SELECT * FROM Employee) WHERE ROWNUM <= 5;

4. 다음 중 LEFT JOIN 시 주의할 점으로 옳은 것은?
WHERE 조건에 걸어도 결과는 LEFT JOIN과 동일하다.
JOIN 조건은 반드시 ON에 작성해야 LEFT JOIN의 특성이 보장된다.
LEFT JOIN은 반드시 GROUP BY와 함께 써야 한다.
LEFT JOINORDER BY보다 먼저 실행된다.


정답 및 해설

  • 문제 1 정답: ②
    • 해설: SQL 실행 순서에 대한 기본적인 문제입니다. FROM이 가장 먼저, ORDER BY가 가장 나중에 실행된다는 것을 기억하면 쉽게 풀 수 있습니다.
  • 문제 2 정답: ②
    • 해설: HAVING그룹핑 후에 적용되는 조건이므로, SUM, AVG 같은 집계 함수에 대한 조건을 걸 때 사용됩니다. WHERE 절에서는 사용할 수 없습니다.
  • 문제 3 정답: ③
    • 해설: Oracle의 ROWNUMORDER BY보다 먼저 실행됩니다. 따라서 쿼리 ①과 ②처럼 작성하면, 정렬되지 않은 상태의 상위 5개를 가져오게 되어 원하는 결과가 나오지 않습니다. 서브쿼리를 사용해 먼저 정렬한 후 ROWNUM 조건을 걸어야 합니다.
  • 문제 4 정답: ②
    • 해설: LEFT JOINWHERE 절에 조건을 걸면 결과가 INNER JOIN과 동일해질 수 있습니다. LEFT JOIN의 특성을 온전히 활용하려면 조인 조건은 반드시 ON 절에 작성해야 합니다.
profile
Hello world!

0개의 댓글