ROWNUM은 오라클 내부적으로 생성되는 가상 컬럼으로 자료의 일부를 잘라내서 이용할 때 사용한다.
즉, ROWNUM을 통해 조회된 컬럼이 몇 번째 컬럼인지 알 수 있다.
위의 사진과 같이 ID와 별개로 순서를 알 수 있는 것이 ROWNUM이다.
1. 먼저 ROWNUM은 아래와 같이 *(모든)과 같이 사용할 수 없다.
SELECT ROWNUM, * FROM MEMBER;
왜냐하면 모든이라는 것은 전부 출력한다는 의미인데 이미 전부를 출력했는데
여기서 다른 것이 포함될 수 없기 때문이라고 할 수 있다.
이 부분은 아래와 같이 명시적으로 정의해준다면 사용할 수 있다.
SELECT ROWNUM, MEMBER.* FROM MEMBER;
2. 1부터 시작하는 ROWNUM이 아니라면 서브쿼리를 사용하자.
이게 무슨 뜻인지는 아래의 설명을 보고 이해해보자.
SELECT * FROM MEMBER WHERE ROWNUM BETWEEN 1 AND 5;
위의 코드는 1부터 5까지의 ROWNUM을 출력하고자 하는 코드이다.
1부터 시작하는 ROWNUM은 결과가 잘 나오는 것을 확인할 수 있다.
SELECT * FROM MEMBER WHERE ROWNUM BETWEEN 6 AND 10;
SELECT * FROM MEMBER WHERE ROWNUM BETWEEN 3 AND 7;
하지만 6부터 10까지의 ROWNUM이나 3부터 7까지의 ROWNUM 등등과 같이
1부터 시작하지 않는다면 아래와 같이 결과가 출력되지 않는 것을 볼 수 있다.
왜냐하면 결과 집합을 만들 때 ROWNUM이 만들어지기 때문이다.
따라서 이를 해결하기 위해서는 결과 집합을 만들 때 ROWNUM을 만드는 것이 아니라
ROWNUM을 원래 있던 것처럼 하기 위해서 아래와 같이 서브 쿼리를 사용해야 한다.
SELECT * FROM (SELECT ROWNUM NUM,MEMBER.* FROM MEMBER)
WHERE NUM BETWEEN 6 AND 10;
이렇게 서브 쿼리를 사용하게 되면 괄호 안에 있는 SQL문이 먼저 실행되면서
ROWNUM을 먼저 만들고 ROWNUM(별칭 NUM)을 6부터 10까지 뽑아낼 수 있게 된다.
먼저 () 안에 있는 코드를 실행시키면 아래의 사진과 같은 결과가 나온다.
이 테이블로부터 ROWNUM(별칭 NUM)을 6부터 10까지의 결과를 아래와 같이 뽑아내게 되는 것이다.
3. ROWNUM에서 정렬(ORDER BY)은 서브 쿼리와 함께 사용하자.
만약에 생일을 기준으로 먼저 태어난 순서대로 ROWNUM을 같이 출력을 하고자 한다면
아래와 같이 코드를 짤 수 있다.
SELECT ROWNUM,MEMBER.* FROM MEMBER
ORDER BY BIRTHDAY ASC;
하지만 이 코드는 결과를 통해서 적합하지 않는 것을 확인할 수 있다.
왜냐하면 ROWNUM을 사용하는 이유가 조회되는 컬럼이 몇 번째인지와 같이
순서를 알기 위해서 사용하는 것인데 위의 결과는 ROWNUM이 뒤죽박죽 섞여있기 때문에
ROWNUM을 사용하는 이유가 없어진 것이라고 할 수 있다.
이러한 결과가 발생한 이유는 위에서 설명한 것과 똑같이
정렬(ORDER BY)이 이루어지기 전에 ROWNUM이 먼저 만들어지기 때문이다.
해결 방법은 마찬가지로 정렬이 된 후에 ROWNUM을 얻을 수 있는 서브쿼리를 사용하면 된다.
서브 쿼리를 사용한다면 아래와 같이 코드를 작성할 수 있다.
SELECT ROWNUM, MEM.*
FROM(SELECT * FROM MEMBER ORDER BY BIRTHDAY ASC) MEM;
() 안에 있는 코드를 먼저 살펴보도록 하자.
ROWNUM을 구하기 위해서는 정렬(ORDER BY)을 해줘야 하기 때문에 () 안에 작성해준 것이다.
SELECT * FROM MEMBER ORDER BY BIRTHDAY ASC;
생일을 기준으로 먼저 태어난 순서대로 정렬이 된 것을 확인할 수 있다.
이 정렬된 테이블을 가지고 ROWNUM을 구하는 것이다.
이렇게 서브쿼리를 통해 정렬을 하고 ROWNUM을 뒤죽박죽이 아니라 순서대로 구할 수 있게 된다.
여기서 먼저 태어난 순서대로 정렬을 하고 ROWNUM이 6부터 10까지인 결과만을 구하고 싶다면
서브쿼리를 한 번 더 사용하도록 해야 한다.
SELECT *
FROM (
SELECT ROWNUM NUM, MEM.*
FROM(SELECT * FROM MEMBER ORDER BY BIRTHDAY ASC) MEM
)
WHERE NUM BETWEEN 6 AND 10;
제일 먼저 서브 쿼리를 통해 먼저 태어난 순서대로 정렬을 하고,
ROWNUM을 6부터 10까지 구하기 위해서 또 서브 쿼리를 사용한 것이다.
'국비 지원 > SQL' 카테고리의 다른 글
[Oracle] 시퀀스(Sequence) (0) | 2023.09.03 |
---|---|
[Oracle] 숫자형 함수와 문자형 함수 (0) | 2023.07.23 |
[SQL] DELETE, TRUNCATE, DROP의 차이점 (0) | 2023.06.10 |
[SQL] DML : 데이터 조작어 (0) | 2023.05.27 |
[SQL] DDL, DML, DCL 명령어 (0) | 2023.05.27 |