목록으로 돌아가기

Ch4. SQL 활용

학습목표

헷갈리는 개념 정리

4.1. 서브쿼리


4.2. 집합연산자


4.3. 그룹함수


4.4. 윈도우함수


4.5. Top N 쿼리

4.5.1. ROWNUM

ROWNUM = 5는 왜 안돼? 5번째 행만 가져오라는 뜻아니야?

SELECT *
FROM Employees
WHERE ROWNUM = 5;

ROWNUM > 1 이 안되는 것과 같은 원리

ROWNUM은 데이터에 미리 저장된 고정된 ‘주소’나 ‘인덱스’가 아니라 WHERE절을 통과해서 조회되는 순서대로 1, 2, 3… 번호표를 즉석에서 붙여주는

ROWNUM은 “1번 선수가 통과해야 2번 선수가 오고, 2번이 통과해야 3번이 온다”는 식입니다. WHERE ROWNUM = 5는 1, 2, 3, 4번 선수를 모두 탈락시키기 때문에 5번 선수는 아예 출발선에 설 수도 없습니다.

쿼리 실행 과정 🕵️‍♂️

  1. DB가 Employees 테이블에서 첫 번째 행을 가져옵니다.
  2. 이 행은 WHERE절 조건을 통과하면 ROWNUM = 1이 될 예정입니다.
  3. WHERE 조건을 검사합니다: “이 행의 ROWNUM이 5인가?” (WHERE 1 = 5)
  4. 결과는 FALSE (거짓)입니다.
  5. WHERE 조건을 통과하지 못했으므로 이 행은 버려집니다. (결국 ROWNUM = 1 번호표를 받지 못함)
  6. DB가 두 번째 행을 가져옵니다.
  7. 첫 번째 행이 버려졌으므로, 이 두 번째 행이 다시 ROWNUM = 1이 될 예정입니다.
  8. WHERE 조건을 검사합니다: “이 행의 ROWNUM이 5인가?” (WHERE 1 = 5)
  9. 결과는 또 FALSE (거짓)입니다.
  10. 이 행도 버려집니다.

이 과정이 테이블 끝까지 반복됩니다. 어떤 행도 ROWNUM = 1이 되는 조건을 통과하지 못했기 때문에, ROWNUM은 2, 3, 4, 5로 넘어갈 기회조차 얻지 못합니다.

ROWNUM의 목적 : 이만큼의 데이터만 가져와

그러면 특정 개수 이하의 데이터만 가져올 수 있는거구나 !

ROWNUM의 목적 : 결과 집합의 최대 개수를 제한하는 것

  • WHERE ROWNUM <= 10 (O): “10개 이하” (10개까지) 가져와. -> 동작함
  • WHERE ROWNUM < 10 (O): “10개 미만” (9개까지) 가져와. -> 동작함
  • WHERE ROWNUM = 5 (X): “5번째만” 가져와. -> 동작 안 함 (1, 2, 3, 4가 다 1 번호표를 받고 False가 되어 버려져서 5가 될 수 없음)
  • WHERE ROWNUM > 5 (X): “5번째 초과” 가져와. -> 동작 안 함 (위와 동일)

그래도 나는 5번째 행만 가져오고 싶어! → 고정해놓고 쓰자

SELECT *
FROM (
    -- 2. 여기서 ROWNUM은 'RN'이라는 별명으로 "고정"됩니다.
    SELECT emp_name, salary, ROWNUM AS RN
    FROM (
        -- 1. 정렬
        SELECT emp_name, salary
        FROM Employees
        ORDER BY salary DESC
    )
)
-- 3. 여기는 ROWNUM이 아니라 'RN'을 필터링합니다.
WHERE RN > 10 AND RN <= 20;

WHERE RN > 10이 가능한 이유: RNROWNUM처럼 즉석에서 1부터 붙는 게 아니라, 이미 안쪽 쿼리에서 1, 2, 3…20… 값으로 확정된(고정된) 일반 숫자 컬럼처럼 취급되기 때문입니다.

요약

  • ROWNUM 자체는 WHERE ROWNUM <= N (N개 이하) 용도로만 쓴다.
  • = 5 (5번째만) 또는 > 10 AND <= 20 (페이징)처럼 특정 위치나 범위를 쓰고 싶으면, 반드시 서브쿼리를 써서 ROWNUMRN같은 별명으로 “고정”시킨 뒤 사용한다.

4.6. 계층형 질의와 셀프 조인


4.7. PIVOT절과 UNPIVOT절


4.8. 정규표현식

댓글남기기