Oracle에서는 MySQL과는 다르게
LIMIT
을 사용할 수 없다. 따라서, ROWNUM
을 통해 다른 방법으로 TOP N개를 추출해야 한다.주로, 빌보드 차트 TOP 100과 같이 위에서 N개를 추출할 때 사용한다.
✅ 1. ROWNUM
ORACLE은 ROWNUM이라는 가짜 컬럼을 가지고 있다. 사용자가 따로 정의한 컬럼이 아닌, 시스템 상에서 존재하는 컬럼이다. ROWNUM은 데이터의 순번을 나타낸다.
☑️ 1) 올바른 예시
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Fe1a18480-88a4-46db-aa53-3a07d94ec86c%252F5bd6bd23-9ca9-46ca-bb83-f1730fcbdce1%252FUntitled.png%3Ftable%3Dblock%26id%3D293b152a-d40b-4557-8167-97befaf24ebc%26cache%3Dv2&w=3840&q=75&dpl=dpl_9Fy5DR7iXit8HvYKCDvmsFiYTXKA)
ROWNUM을 WHERE 절에 사용하여 데이터를 특정 개수만큼 가져올 수 있다.
☑️ 2) 잘못된 예시
단, 주의할 점은
ROWNUM은
WHERE ROWNUM = 5
와 같은 조건을 사용할 수 없다. ![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Fe1a18480-88a4-46db-aa53-3a07d94ec86c%252F4fc1f5cd-d385-4e4b-9312-ddc3b415cf52%252FUntitled.png%3Ftable%3Dblock%26id%3D24263bd6-f83c-4249-85fc-87eded58be78%26cache%3Dv2&w=3840&q=75&dpl=dpl_9Fy5DR7iXit8HvYKCDvmsFiYTXKA)
그 대신,
WHERE ROWNUM < 5
와 같은 조건식을 사용해야 한다.☑️ 3) 예외로 = 1은 가능함
예외로,
WHERE ROWNUM = 1
은 사용이 가능하다.![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Fe1a18480-88a4-46db-aa53-3a07d94ec86c%252F4b7408a8-1822-4d0a-b415-0a95f1007152%252FUntitled.png%3Ftable%3Dblock%26id%3D77330816-9324-4db5-b5e0-99826ebdbe58%26cache%3Dv2&w=3840&q=75&dpl=dpl_9Fy5DR7iXit8HvYKCDvmsFiYTXKA)
☑️ 4) 주의 사항
또 주의할 점은,
ORDER BY
절이 WHERE
절보다 나중에 수행되기 때문에 ROWNUM
으로 순서를 지정할 때에는 ORDER BY
절 바깥에서 해야 한다. ROWNUM
과 ORDER BY
를 같은 단락에서 작성하게 될 경우 ROWNUM
으로 랜덤하게 순서가 지정된 후 ORDER BY
로 정렬되기 때문이다.![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Fe1a18480-88a4-46db-aa53-3a07d94ec86c%252F88f612c2-da7f-4d0f-b4b0-2a585ccf6fdf%252FUntitled.png%3Ftable%3Dblock%26id%3D8efa9461-d603-4302-81a9-337e09d8c210%26cache%3Dv2&w=3840&q=75&dpl=dpl_9Fy5DR7iXit8HvYKCDvmsFiYTXKA)
잘못된 경우. ROWNUM이 먼저 부여되고, 10개를 가져와 정렬함.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Fe1a18480-88a4-46db-aa53-3a07d94ec86c%252Fe43a5bf1-8ae9-4579-b625-bc4bd7d5c489%252FUntitled.png%3Ftable%3Dblock%26id%3Db12228f5-790c-4dc9-b645-3d3d869100d0%26cache%3Dv2&w=3840&q=75&dpl=dpl_9Fy5DR7iXit8HvYKCDvmsFiYTXKA)
올바른 경우. 정렬된 데이터를 가져와 ROWNUM을 부여하고, 상위 10개를 가져옴.
✅ 2. 그 외
그 외에도
RANK
나 DENSE_RANK
를 사용할 수 있지만, 이들은 중복 순위가 부여될 수 있기 때문에 상황에 맞게 선택해야 한다.Share article