Top-N 쿼리는 선택된 데이터 집합에서 상위 N개의 결과만 출력한다. 상위 N개의 결과를 출력하기 위해 ROWNUM이라는 가상 컬럼(Pseudo Column) 또는 윈도우 함수 ROW_NUMBER()를 사용한다. ROWNUM 가상 컬럼은 테이블에 포함되어 있는 값은 아니지만 행을 출력할 때 일련 번호를 부여해 준다. 테이블에 포함되어 있는 관리 대상 데이터는 아니기 때문에 가상 컬럼이라고 불린다. 예를 통해 살펴보자.
SELECT ROWNUM, 국어, 영어, 수학
FROM( SELECT 국어, 영어, 수학
FROM EXAMRESULT
ORDER BY 국어 DESC, 영어 DESC, 수학 DESC)
WHERE ROWNUM <=5;
쿼리는 두 부분으로 이루어져있다. 먼저 국어, 영어, 수학 성적을 출력하고 정렬하는 내부 쿼리와 정렬된 결과에서 일련 번호 순으로 5개 즉 상위 5개의 결과를 출력하는 외부 SELECT 쿼리로 이루어져 있다. 만약 쿼리를 두 부분으로 나누지 않고 아래와 같이 하나로 한다면 ORDER BY 절이 가장 나중에 수행되면서 무작위로 5개의 결과를 얻게된다.
SELECT ROWNUM, 국어, 영어, 수학
FROM EXAM_RESULT
WHERE ROWNUM <= 5
ORDER BY 국어 DESC, 영어 DESC, 수학 DESC;
ROWNUM이 WHERE 조건절에 사용될 때는 <, <= 조건으로만 사용이 가능하다. ROWNUM 이전 행의 번호에 +1씩 더해가기 때문에 = 조건으로 앞 행을 건너뛸 수 없기 때문이다. 즉, 앞 행을 출력한 후에야 다음 행 ROWNUM을 계산할 수 있다.
ROWNUM 대신 윈도우 함수 ROW_NUMER()를 사용할 수도 있다. 결과는 같다.
SELECT *
FROM ( SELECT 국어, 영어, 수학
ROW_NUMBER() OVER (ORDER BY 국어 DESC, 영어 DESC, 수학 DESC) AS RNUM
FROM EXAMRESULT)
WHERE RNUM <= 5;
쿼리에서 ORDER BY 절이 WHERE 절보다 나중에 수행되기 때문에 Top N 쿼리를 작성할 때는 ROWNUM 순서를 ORDER BY 절 바깥에 지정해야 한다. 만약 ROWNUM과 ORDER BY를 같은 단락에서 작성하게 될 경우 ROWNUM으로 랜덤하게 순선가 지정된 후에 ORDER BY 연산으로 정렬이 이루어지기 때문에 원하는 순서를 얻을 수 없게된다.
■
'데이터 모델과 SQL' 카테고리의 다른 글
[SQL 이해하기] - 17. SQL: DML과 DDL (0) | 2023.07.08 |
---|---|
[SQL 이해하기] - 16. SQL: 계층 쿼리 (0) | 2023.07.07 |
[SQL 이해하기] - 14. SQL: 윈도우 함수 - 종류와 동작 (0) | 2023.07.06 |
[SQL 이해하기] - 13. SQL: 윈도우 함수 (0) | 2023.07.06 |
[SQL 이해하기] - 12. SQL: 합계 함수(GROUPING SETS, ROLL UP, CUBE) (0) | 2023.07.05 |
댓글