티스토리 뷰

DataBase/오라클 SQL

ROWNUM (Oracle DataBase)

GrapeMilk 2020. 5. 3. 15:26

Goal

 - 페이징에 대해 알아본다

 - ROWNUM에 대해 알아본다

 - ROWNUM을 통한 페이징을 실습해본다.

1. 페이징이란?

 - 100개의 레코드가 있을 때 그 중에서 5개씩 결과를 제한하여 확인하는 것과 같이 어떤 자료를 끊어서 확인 하는 것을 페이징이라고 한다. 페이징을 통해 끊어진 자료들의 묶음을 페이지라고 한다. 

 - 페이징을 통해 페이지를 뽑아내기 위해서는 어떠한 기준이 필요한데, 이를 위해 오라클에서는 결과 집합이 만들어 질 때(SELECT에서 WHERE절을 실행할 때) 테이블을 조회하면서 ROWNUM이라는 컬럼을 추가한다.

 

2. ROWNUM

 - SELECT 명령어 수행후 결과 집합이 만들어 졌을 때 부여받는 데이터들의 일련 번호.

ex) SELECT * FROM MEMBER WHERE ROWNUM BETWWEN 1 AND 5 : ROWNUM 1부터 5까지의 로우를 출력한다.

3. ROWNUM을 통한 페이징

3-1 ROWNUM을 통한 페이징시 주의점

 - ROWNUM은 무조건 1번부터 시작하기 때문에 SELECT * FROM MEMBER WHERE ROWNUM BETWEEN 6 AND 10과 같이 2번째 페이지를 만들기 위한 명령어를 시행해도 아무것도 출력되지 않는다. (SELECT문을 실행할 때마다 BETWEEN 조건에 관계 없이 일련번호들은 1부터 세팅되기 때문)

 

위와 같은 ROWNUM의 특징으로 인해 페이징 기법에서 ROWNUM을 바로 사용하는 것은 적절하지 않고, SELECT 명령어로 페이징을 수행하기 전에 결과 집합으로 ROWNUM값을 미리 얻어오는 작업이 필요하다. (서브쿼리)

 

3-2 ROWNUM을 미리 얻어오기

 

  - SELECT * FROM ( ) : 지금까지, SELECT FROM절을 사용했을 때, 항상 FROM절 뒤에 테이블명을 사용했지만 FROM절 뒤에는 테이블 뿐만아니라 격자형의 데이터를 만들어내는 쿼리를 이용할 수도 있다(서브쿼리). 따라서 FROM절안에 NUMBER가 붙은 쿼리문을 이용하여 결과 집합을 얻은 후 다시 쿼리를 실행할 수 있다.

 

1) SELECT * FROM ( SELECT ROWNUM NUM, MEMBER.* FROM MEMBER ) WHERE NUM BETWEEN 1 AND 5

 - SELECT * FROM 명령어를 실행하기 전에 괄호( ) 안의 SELECT ROWNUM NUM, MEMBER.* FROM MEMBER 쿼리를 우선적으로 실행하여 NUM을 별칭으로한 ROWNUM을 MEMBER의 모든 속성과 합친 결과 집합을 얻은 후 해당 집합에서 페이징 작업을 실행하도록 한다. 

 

*ROWNUM NUM : ROWNUM에 NUM이라는 별칭을 부여한 이유는, 별칭을 부여하지 않으면, 바깥 쪽의 SELECT문을 실행 했을 때, 안쪽의 결과 집합을 통해 얻은 ROWNUM 값을 활용하는 것이 아닌, 새로운 ROWNUM값을 활용하게 되어 다시 일련 번호가 1부터 리셋되어 6 ~ 10의 값을 페이징 할 수 없게 되기 때문에 안쪽의 ROWNUM 값이라는 것을 고유하게 알려주는 NUM 별칭을 사용한다

 

*SELECT ROWNUM NUM, MEMBER.* FROM MEMBER : 안쪽의 SELECT문에서 SELECT * FROM MEMBER를 하지 않고 ROWNUM NUM, MEMBER.* 쿼리를 작성한 이유는, *는 모든 값을 받아오기는 하지만 ROWNUM값은 해당되지 않아 ROWNUM 값과 MEMBER의 모든 속성을 더해주는 결과 집합을 구하기 위해서 위와 같이 쿼리문을 작성한다.

 

즉, 미리 결과집합을 만들어 놓아 ROWNUM값을 얻어 온 뒤, 바깥의 SELECT문을 실행할 때는 ROWNUM의 변동없이 사용할 수 있도록 하여 1 ~ 5까지의 페이지 뿐만아닌 6 ~ 10까지의 페이지도 얻어올 수 있도록 한다.

'DataBase > 오라클 SQL' 카테고리의 다른 글

DISTINCT (Oracle SQL) + 단원 정리  (0) 2020.05.03
정규식을 이용한 패턴 비교 (REGEX_LIKE)  (2) 2020.04.29
연산을 통한 데이터 조회  (0) 2020.04.28
트랜잭션 (DATA BASE)  (0) 2020.04.27
데이터 조작하기 DML  (0) 2020.04.27
댓글