[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