순위 함수와 ROWNUM은 데이터에 순서나 순위를 부여하는 데 사용됩니다. SQLD 시험에서는 각 함수가 동점자를 처리하는 방식과 ROWNUM의 특성을 정확히 이해하는 것이 중요합니다.
RANK / DENSE_RANK / ROW_NUMBER)RANK(): 동점자에게는 같은 순위를 부여하고, 다음 순위를 건너뜁니다. (스킵)DENSE_RANK(): 동점자에게는 같은 순위를 부여하지만, 다음 순위를 건너뛰지 않습니다. (조밀)ROW_NUMBER(): 동점자 유무와 관계없이 각 행에 고유한 일련번호를 부여합니다.함수() OVER ([PARTITION BY 컬럼] ORDER BY 컬럼)ORDER BY는 순위를 매길 기준을 정합니다.PARTITION BY를 사용하면 특정 그룹(예: 부서별) 안에서 순위를 다시 매길 수 있습니다.ROWNUM**은 쿼리의 결과 집합에 순서대로 부여되는 가상 컬럼입니다.ORDER BY보다 먼저 실행됩니다. 따라서 ROWNUM이 부여된 후 정렬되므로, 원하는 순서대로 번호를 매기려면 인라인 뷰를 사용해야 합니다.TOP 5, 10위까지)를 할 때 매우 중요한 특징입니다.ROWNUM = N (예: ROWNUM = 5)FALSE**입니다. ROWNUM은 1부터 순차적으로 할당되므로, ROWNUM = 1이 충족되지 않으면 다음 행에 번호를 할당할 수 없기 때문입니다.ROWNUM <= N (예: ROWNUM <= 5)1부터 5까지 번호가 부여된 행들을 반환합니다.| 구분 | RANK | DENSE_RANK | ROW_NUMBER | ROWNUM |
|---|---|---|---|---|
| 동점 처리 | 스킵 | 스킵 안 함 | 무시 (일련번호) | 순서대로 부여 |
| 특징 | 공동 순위 + 점프 | 공동 순위 + 조밀 | 그냥 번호표 | Oracle 전용, 정렬보다 먼저 실행 |
| 암기팁 | RANK = Jump | DENSE = Dense (조밀) | NUMBER = Numbering (번호 매기기) | ROWNUM = Oracle 전용 |
1. 다음 SQL 실행 결과를 예측하시오.
SELECT ename, sal, RANK() OVER (ORDER BY sal DESC) AS rnk
FROM Emp;
(급여 데이터: 3000, 2975, 2975, 2850)
A. 3000(1), 2975(2), 2975(3), 2850(4)
B. 3000(1), 2975(2), 2975(2), 2850(3)
C. 3000(1), 2975(2), 2975(2), 2850(4)
D. 3000(1), 2975(2), 2975(3), 2850(4)
2. 다음 SQL 실행 결과에 대한 설명으로 옳은 것은?
(단, Oracle 환경)
SELECT * FROM Emp WHERE ROWNUM = 5;
A. 5번째 행이 출력된다.
B. 5번째 행부터 5개 행이 출력된다.
C. ROWNUM은 1부터 순차적으로 할당되므로 조건이 충족되지 않아 아무것도 출력되지 않는다.
D. ORDER BY가 없어 오류가 발생한다.
3. 다음 중 ORDER BY 절을 사용한 후에도 동점자 유무와 관계없이 순차적으로 1씩 증가하는 고유한 번호를 부여하는 함수는?
A. RANK()
B. DENSE_RANK()
C. ROW_NUMBER()
D. ROWNUM
RANK()는 동점(2975)에게 같은 순위(2)를 부여하고, 다음 순위(3)를 건너뛰어 4번째 순위부터 시작합니다.ROWNUM은 1부터 순차적으로 부여되므로 ROWNUM = 1을 만족하는 첫 번째 행이 먼저 선택됩니다. ROWNUM = 5를 만족하는 행이 존재할 수 없습니다. 원하는 결과를 얻으려면 인라인 뷰를 사용해야 합니다.ROW_NUMBER()는 동점 유무와 관계없이 정렬 순서에 따라 1부터 1씩 증가하는 고유한 일련번호를 부여합니다.