현재 선택한 SQL 과정

SQLP 이론 학습

이론 목록으로 돌아가기

SELECT 논리적 처리 순서

작성 순서와 다른 FROM→WHERE→GROUP BY→HAVING→SELECT→ORDER BY의 논리 흐름을 익힌다.

예상 읽기 6

핵심 요약

작성 순서와 다른 FROM→WHERE→GROUP BY→HAVING→SELECT→ORDER BY의 논리 흐름을 익힌다.

핵심 질문

  1. SELECT 논리적 처리 순서에서 반드시 구분해야 할 개념과 결과 규칙은 무엇인가?
  2. 0건·1건·여러 건과 NULL·동점·중복 데이터에서 결과가 어떻게 달라지는가?
  3. 비슷해 보이는 문법과 결과가 같아지는 조건, 달라지는 조건은 무엇인가?
  4. 작은 샘플 데이터를 이용해 결과를 실수 없이 예측하는 순서는 무엇인가?

학습 목표

  • SELECT 문을 논리적 처리 순서에 따라 해석한다.
  • 별칭을 사용할 수 있는 절이 제한되는 이유를 설명한다.

개념 지도

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
FROM에서 행 집합 생성 → WHERE 행 필터 → GROUP/HAVING → SELECT → ORDER BY

핵심 내용

SQL은 SELECT부터 작성하지만 결과를 이해할 때는 다음 개념적 순서로 읽는다.

  1. FROMJOIN: 원본 행 집합 생성
  2. WHERE: 개별 행 필터
  3. GROUP BY: 그룹 생성
  4. HAVING: 그룹 필터
  5. SELECT: 출력 식과 별칭 계산
  6. ORDER BY: 최종 결과 정렬
SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
SELECT deptno, SUM(sal) AS total_sal
FROM emp
WHERE status = 'ACTIVE'
GROUP BY deptno
HAVING SUM(sal) >= 10000
ORDER BY total_sal DESC;

WHERE 시점에는 SELECT 별칭 total_sal이 아직 만들어지지 않았으므로 일반적으로 사용할 수 없다. ORDER BY는 SELECT 이후이므로 별칭을 사용할 수 있다.

흔한 오해와 주의점

  • WHERE는 그룹화 전 행을, HAVING은 그룹화 후 그룹을 거른다.
  • GROUP BY가 있는 SELECT 목록의 일반 컬럼은 그룹 기준이거나 집계식이어야 한다.
  • SQL 작성 순서와 논리적 처리 순서를 구분한다.

문항 풀이 보강: 작성 순서와 사용 가능 표현

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
FROM/JOIN
→ WHERE
→ GROUP BY
→ HAVING
→ SELECT
→ DISTINCT
→ ORDER BY
→ 행 제한

HAVING COUNT(*) > 1처럼 SELECT 목록에 표시하지 않은 집계 함수를 HAVING에서 사용할 수 있다. HAVING은 SELECT보다 논리적으로 먼저 그룹을 필터하기 때문이다.

윈도우 함수는 GROUP BY와 HAVING으로 만들어진 결과 집합에 적용되고 SELECT 단계에서 계산된다. 따라서 같은 SELECT 단계의 윈도우 함수 별칭을 WHERE에서 바로 사용할 수 없으며 인라인 뷰나 CTE로 한 단계를 더 만든다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
SELECT *
FROM (
  SELECT e.*,
         ROW_NUMBER() OVER (
           PARTITION BY deptno ORDER BY sal DESC
         ) rn
  FROM emp e
)
WHERE rn <= 3;

SQL에 절을 작성하는 순서와 각 절의 결과가 만들어지는 논리적 순서는 다르므로, 별칭과 집계 결과를 어느 단계에서 사용할 수 있는지 기준으로 판단한다.

한 SQL을 단계별로 해석하기

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
SELECT d.deptno, COUNT(*) AS cnt
FROM   emp e
JOIN   dept d ON d.deptno = e.deptno
WHERE  e.status = 'ACTIVE'
GROUP  BY d.deptno
HAVING COUNT(*) >= 5
ORDER  BY cnt DESC;
CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
1. FROM/JOIN   emp와 dept의 행 조합 생성
2. WHERE       ACTIVE 행만 남김
3. GROUP BY    deptno별 그룹 생성
4. HAVING      직원 5명 이상 그룹만 남김
5. SELECT      deptno와 COUNT를 계산·출력
6. ORDER BY    별칭 cnt로 최종 결과 정렬

SELECT 별칭은 같은 Query Block의 WHERE에서 일반적으로 사용할 수 없다. WHERE가 SELECT보다 논리적으로 먼저 처리되기 때문이다. ORDER BY는 SELECT 뒤이므로 별칭을 사용할 수 있다.

Window Function의 위치

분석 함수는 WHERE·GROUP BY·HAVING으로 만들어진 행 집합에 SELECT 단계에서 적용된다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
SELECT deptno, cnt,
       RANK() OVER (ORDER BY cnt DESC) AS rnk
FROM (
  SELECT deptno, COUNT(*) cnt
  FROM emp
  GROUP BY deptno
);

분석 함수 결과로 다시 필터하려면 Query Block을 한 단계 감싼다.

작성 순서와 논리적 처리 순서 구분

작성 순서는 SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY이지만, 결과를 해석할 때는 FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY의 논리적 순서를 적용한다.


결과를 검증하는 순서

  1. 각 Query Block이 만드는 한 행의 의미를 먼저 적습니다.
  2. 조건을 적용하기 전 원본 행과 적용 후 남는 행을 작은 표로 그립니다.
  3. NULL 비교가 TRUE, FALSE, UNKNOWN 중 무엇인지 구분합니다.
  4. 중복 제거, 그룹화, 정렬과 행 제한이 적용되는 순서를 확인합니다.
  5. 데이터가 0건·1건·여러 건일 때도 같은 규칙이 성립하는지 검증합니다.

실무와 시험에서 함께 확인할 항목

  • ORDER BY가 없다면 결과 순서를 가정하지 않습니다.
  • 문자열·숫자·날짜 비교에서는 데이터 타입과 명시적 형변환을 확인합니다.
  • 같은 결과처럼 보이는 SQL도 NULL과 중복이 있을 때 달라질 수 있습니다.
  • 문법을 외우기 전에 샘플 데이터 3~5행으로 결과를 직접 계산합니다.

마지막 점검

  • 작성 순서가 아니라 SQL의 논리적 처리 순서로 결과를 계산합니다.
  • NULL을 0이나 빈 값과 같은 것으로 취급하지 않습니다.
  • ORDER BY가 없는 결과 순서와 DISTINCT 없는 중복 제거를 가정하지 않습니다.
  • 비슷한 문법은 0건·다건·NULL 데이터를 넣어 결과가 정말 같은지 확인합니다.

복습 문제

  1. SELECT 별칭을 WHERE에서 바로 쓰기 어려운 이유는?
  2. 행 수를 먼저 줄이는 절과 그룹 수를 줄이는 절은 각각 무엇인가?
  3. 샘플 데이터 3행으로 결과를 직접 계산할 수 있는가?
  4. NULL이 포함될 때 결과가 달라지는 지점은 어디인가?