[Oracle] ROWNUM 파악하기

반응형

 

ROWNUM

 

ORACLE의 테이블 내용에 순번을 출력하기 위해 사용하는 가상컬럼 중 하나입니다.

테이블의 SELECT문 출력 할 때, 순번이 필요할 때 주로 이용합니다.

 

특히 DB 관리자 및 관계자 외에 SEQUENCE가 보통 NUMBER로 순번을 나타낼 때가 있지만,

이를 감추기 위해 사용하거나 혹은 일반사람들이 이용하는 게시판의 순번을 알리기 위해서도 사용되기도 합니다.

 

🏁  순번을 사용하는 이유

🖊️ 중요한 PK를 감추기 위해서

🖊️ 순번을 테이블로 보관할 경우, 중간의 정보가 삭제될 경우 순번이 띄어 넘는 문제가 발생됩니다. 이를 방지하기 위함.

 

 

 

ORACLE에서 ROWNUM 기본 사용 방법

ROWNUM은 ORACLE에서 사용하는 가상화 컬럼 중 하나입니다.

ROWNUM의 사용방법은 먼저 크게 두 가지로 나뉠 수 있습니다.

 

 

📝 순번을 표시하기

SELECT ROWNUM
FROM [테이블 명]

 

ROWNUM을 SELECT의 조회 결과로 입력하는 방법입니다.

Alias 사용 가능합니다.

 

여기서 ROWNUM은 조회 결과를 출력하는 방법에 사용됩니다.

사용하기 위해서는   '*' 사용을 할 수 없으며, ROWNUM이라는 가상 컬럼을 정의해야 합니다.

 

 

 📝 표시 제한하기

SELECT *
FROM TB_EMPLOYEES
WHERE ROWNUM <= 5;

 

SELECT의 출력 결과를 제한을 걸 수 있습니다.

해당 사진은 출력된 결과문의 상위 5행까지 출력의 제한을 이용합니다.

 

equals보다는 ( <=, <, >, >= ) 사용을 지향합니다.

BETWEEN과 IN 같은 경우에는 1부터 사용이 가능하며, 순번이 중간에 끊길 경우 출력이 중단됩니다.

 

 

게시글의 출력 결괏값이 1000개이지만, 화면상에는 20개, 50개만 표시될 때 이용되는 방법입니다.

출력의 개수를 제한함으로써, 언어의 메모리 소모량을 줄일 수 있습니다.

 

 

 

ORACLE에서 ROWNUM 활용하기

SELECT ROWNUM, EMPLOYE_ID, SALARY
FROM
    (SELECT * FROM TB_EMPLOYEES
              ORDER BY SALARY DESC);

 

ROWNUM의 기본 사용방법을 응용을 해보았습니다.

 

순번이 뒤죽박죽이라면, 순번을 정의할 수 있다면 원하는 대로 순번이 만들어지지 않을까

 

사용자 정의로 순번을 활용하기 위해서는 서브쿼리ORDER BY 정렬 구문필요합니다.

여기서 POINT는 정렬한 순서대로 순번을 메기기 위해서는 서브쿼리 안에서 ORDER BY 정렬구문을 사용해야 한다는 점입니다.

 

 

 

왜 ❓

연봉별로 내림차순은 되었지만, 순번은 뒤죽박죽이 되었다.

이유는 SQL의 읽는 순서 하고도 연관이 있는데요.

SQL에서 ORDER BY는 쿼리문 중에서 제일 마지막으로 읽는 부분이며, 서브쿼리를 사용하지 않을 경우

정렬은 될 수 있으나 순번이 엉망이 될 수가 있기 때문입니다.

 

 

 

서브쿼리를 이용하면, 정렬에 따른 순번이 정의가 된다.

따라서 이를 해결하기 위해서는 서브쿼리 안에서 정렬을 먼저 실행한 후에 ROWNUM 정의하면

쉽게 정렬이 되는 것을 확인할 수 있습니다.

 

 

 

SQLD, ROWNUM 관련 문제 응용하기

 

ROWNUM 관련 된 SQLD문제를 하나 가져와봤습니다.

 

예제의 문제를 해석한다면, SALARY를 오름차순 했을 때, 상위 10행을 표시하는 문제입니다.

ORDER BY SALARY이므로, 연봉을 낮은 쪽에서 오름차순으로 상위 10명이므로, 회사원 내의 최저임금순대로 10위까지의 출력입니다.

 

 

💬 여기서 문제 풀기 전에, 질문과 정답 2의 차이를 잠시 살펴보도록 하겠습니다.

 

TOP(10)과 TOP(10) WITH TIES ~가 섞여 있는데요.

이는 TOP(10)은 중복 불가 TOP(10) WITH TIES ~는 중복 허용입니다.

 

 

 

하나씩 해석을 나아가겠습니다.

 

 

1번

서브쿼리 없이, ROWNUM을 통해 출력값 10개로 제한을 걸었습니다.

그 후 정렬이 진행이 되었으므로, 질문의 상위 10개에 대한 출력이 아닌 INSERT 입력된 10개 순서 안에서 연봉을 오름차순 정렬하였습니다.

 

 

2번

중복 허용과 중복 허용 아님의 차이입니다.

TOP(10)은 중복 불가입니다. [ORACLE 함수가 아니므로 PASS]

 

 

3번

서브쿼리는 존재하지만 ROWNUM을 서브쿼리 안에서 사용하였습니다.

따라서 결과는 1번처럼 연봉은 정렬되었을 수도 있지만 순번이 뒤죽박죽이 되었습니다.

 

 

4번

정렬이 이쁘게 완성되었습니다.

서브쿼리와 ROWNUM의 위치가 다르므로 정렬이 잘 된 것을 확인할 수 있습니다.

 

 

 

반응형

댓글

Designed by JB FACTORY