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번 선수는 아예 출발선에 설 수도 없습니다.
쿼리 실행 과정 🕵️♂️
- DB가
Employees테이블에서 첫 번째 행을 가져옵니다. - 이 행은
WHERE절 조건을 통과하면ROWNUM = 1이 될 예정입니다. WHERE조건을 검사합니다: “이 행의 ROWNUM이 5인가?” (WHERE 1 = 5)- 결과는
FALSE(거짓)입니다. WHERE조건을 통과하지 못했으므로 이 행은 버려집니다. (결국ROWNUM = 1번호표를 받지 못함)- DB가 두 번째 행을 가져옵니다.
- 첫 번째 행이 버려졌으므로, 이 두 번째 행이 다시
ROWNUM = 1이 될 예정입니다. WHERE조건을 검사합니다: “이 행의 ROWNUM이 5인가?” (WHERE 1 = 5)- 결과는 또
FALSE(거짓)입니다. - 이 행도 버려집니다.
이 과정이 테이블 끝까지 반복됩니다.
어떤 행도 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이 가능한 이유: RN은 ROWNUM처럼 즉석에서 1부터 붙는 게 아니라, 이미 안쪽 쿼리에서 1, 2, 3…20… 값으로 확정된(고정된) 일반 숫자 컬럼처럼 취급되기 때문입니다.
요약
ROWNUM자체는WHERE ROWNUM <= N(N개 이하) 용도로만 쓴다.= 5(5번째만) 또는> 10 AND <= 20(페이징)처럼 특정 위치나 범위를 쓰고 싶으면, 반드시 서브쿼리를 써서ROWNUM을RN같은 별명으로 “고정”시킨 뒤 사용한다.
댓글남기기