[SQL] TOP-N 쿼리 (ROWNUM)

Oracle에서는 MySQL과는 다르게 `LIMIT`을 사용할 수 없다. 따라서, `ROWNUM`을 통해 다른 방법으로 TOP N개를 추출해야 한다. 주로, 빌보드 차트 TOP 100과 같이 위에서 N개를 추출할 때 사용한다.
Hi's avatar
Aug 20, 2024
[SQL] TOP-N 쿼리 (ROWNUM)

💡
Oracle에서는 MySQL과는 다르게 LIMIT을 사용할 수 없다. 따라서, ROWNUM을 통해 다른 방법으로 TOP N개를 추출해야 한다.
주로, 빌보드 차트 TOP 100과 같이 위에서 N개를 추출할 때 사용한다.
 

✅ 1. ROWNUM

💡
ORACLE은 ROWNUM이라는 가짜 컬럼을 가지고 있다. 사용자가 따로 정의한 컬럼이 아닌, 시스템 상에서 존재하는 컬럼이다. ROWNUM은 데이터의 순번을 나타낸다.
 

☑️ 1) 올바른 예시

notion image
ROWNUM을 WHERE 절에 사용하여 데이터를 특정 개수만큼 가져올 수 있다.
 

☑️ 2) 잘못된 예시

단, 주의할 점은
ROWNUM은 WHERE ROWNUM = 5와 같은 조건을 사용할 수 없다.
notion image
그 대신, WHERE ROWNUM < 5 와 같은 조건식을 사용해야 한다.
 

☑️ 3) 예외로 = 1은 가능함

예외로, WHERE ROWNUM = 1은 사용이 가능하다.
notion image
 
 

☑️ 4) 주의 사항

또 주의할 점은,
ORDER BY 절이 WHERE 절보다 나중에 수행되기 때문에 ROWNUM으로 순서를 지정할 때에는 ORDER BY 절 바깥에서 해야 한다. ROWNUMORDER BY를 같은 단락에서 작성하게 될 경우 ROWNUM으로 랜덤하게 순서가 지정된 후 ORDER BY로 정렬되기 때문이다.
 
notion image
잘못된 경우. ROWNUM이 먼저 부여되고, 10개를 가져와 정렬함.
 
notion image
올바른 경우. 정렬된 데이터를 가져와 ROWNUM을 부여하고, 상위 10개를 가져옴.
 

✅ 2. 그 외

💡
그 외에도 RANKDENSE_RANK를 사용할 수 있지만, 이들은 중복 순위가 부여될 수 있기 때문에 상황에 맞게 선택해야 한다.
 
Share article

soultree