Programming/SQL

ROWNUM, 페이징을 통한 열의 단위집합 출력 2021-06-29

최동훈1 2021. 6. 29. 15:38

이전까지는 난 오라클에서 SELECT 문을 통해 결과집합을 출력할떄, 기존에 있던 칼럼(column : 열) 에서 ROWNUM이라는 새로운 칼럼을 추가해 준다는 것을 몰랐다. 그런데 난 

SELECT * FROM (SELECT ROWNUM NUM,NOTICE.* FROM NOTICE) WHERE NUM BETWEEN 2 AND 7; 

이 구문을 이해하는 과정에서, 알게 되었다. 사실 오늘 내가 설명하려고 하는 모든 내용이 이 한 구문안에 다 존재한다.

우선 문제의 시작은 테이블에서 특정 갯수만 출력할때, 어떤 SQL 구문을 만들어야 하는가에서 시작된다. 예를들면 가장 상위의 5개씩 출력, 하위의 2~7 ROWNUM 출력 등이다. 우선 ROWNUM 이 무엇인가?

우리가 SELECT 문을 통해 테이블을 출력하면 아무 칼럼의 이름이 없이 오름차순으로 숫자만 붙여져 있는것이 있는데, 그게 바로 오라클에서 새로 생성해주는 ROWNUM이라는 칼럼이다.

여기 이렇게 ID 칼럼 옆에 나오는 이름없는 칼럼이 바로 ROWNUM(1,2,3,4,5,6,7) 이다.

 

그런데 ROWNUM에는 특징이 있다. 바로 어떤 테이블을 출력하든 무조건 1부터 시작한다는 것이다. 즉, ROWNUM을 기준으로 페이징을 하여 출력하면, 그 범위가 1부터 시작하지 않는 이상, 절떄 출력이 안되는 것이다.

순서상 테이블의 2번째에 있는 유재석부터 출력하려해도, ROWNUM 입장에서는 첫번째 이기떄문에 1 부여-> 따라서 

SELECT * FROM NOTICE WHERE ROWNUM BETWEEN 5 AND 7; 이렇게는 아예안됨. 왜냐? 애초에 ROWNUM 이 1부터 시작으로 고정되있기 때문.

 

그렇다면 해결방법은 무엇일까? 간단해 설명해서 새로운 테이블 결과집합을 뽑아내고 거기서 ROWNUM을 이용하는 것이다.

우선

SELECT ROWNUM, NOTICE.* FROM NOTICE;

이 구문을 실행했다고 하자, 처음에 난 애초에 NOTICE 테이블에는 ROWNUM이란 칼럼이 존재하지도 않는데, SELECT 문에 왜 들어가는지 몰랐는데, 오라클에서 자동으로 추가해주는 칼럼 이기에 테이블에 존재한다고 봐야한다는 것을 깨달았다. 그리고 NOTICE. 이 왜 나오는지 몰랐는데, 우선 *만 쓰게 될 경우 에러가 난다. 이유는 *는 모든 칼럼을 출력한다는 뜻인데, ROWNUM 칼럼 한개도 출력한다는 것과 상충되기 떄문이다. 그래서 NOTICE. 을 붙이면 NOTICE 테이블"의" 모든 칼럼으로 범위가 축소되기에 ROWNUM 칼럼을 더해서 출력 가능하다. 실재로 우리는 이 . 기호를 생략해서 쓰고 있었다.

 

SELECT ID, PWD, NAME FROM NOTICE;
SELECT NOTICE.ID, NOTICE.PWD, NOTICE.NAME FROM NOTICE;
--위 두 구문은 완벽히 동일한 기능을 함.

 근데 솔직히..NOTICE.*은 이해가 안된다.. *과 똑같지 않나..? 그냥 문법적으로 모든칼럼 출력이 아니라는 것을 표현해 준 것이라고 생각해야 겠다.

 

아무튼 SELECT ROWNUM, NOTICE.* FROM NOTICE; 문을 통해 ROWNUM이 붙은 새로운 테이블 결과집합이 출력됬다. 우리는 이 완성된 결과집합를 활용해서 해당 인덱스를 출력해 줄 것이다.

SELECT * FROM (SELECT ROWNUM AS NUM, NOTICE.* FROM NOTICE) WHERE NUM BETWEEN 2 AND 7;

FROM 뒤에 결과집합을 또 이용할수 있다는 개념도 오늘 공부하며 배울수 있었다. 

 

위 구문을 해석 하자면

 

새로 만들어진 (괄호 안의 SELECT 문을 통해 생성된 결과집합)에 존재하는 칼럼인 NUM 의 범위가 2랑 7사이에 있는 모든 테이블의 칼럼을 출력하라 

라는 뜻이 된다. 그런데 ROWNUM 의 별칭을 NUM으로 한 이유는 어짜피 새롭게 출력하는 테이블에도 오라클이 ROWNUM 칼럼을 추가할 것이기 때문에, 결과집합의 ROWNUM기준으로 출력이 아닌, 새롭게 만들어진 ROWNUM 기준이 되기 떄문에, 별칭을 붙임으로써, 구별짓게 한 것이다.

 

결과: 실제 결과집합의 ROWNUM에서 별칭붙여 만든 NUM이랑(6,7) 새로 만들어진 ROWNUM(1,2)이랑 별도로 나옴.

 

공부요약

* 오라클은 출력을 할떄, ROWNUM 이라는 칼럼을 새로 추가해준다. 이때 인덱스는 무조건 1부터 오름차순으로 붙여진다.

*SELECT 문을 FROM뒤에 또 다른 결과집합을 넣을 수 있다.

* 테이블.필드명 에서 테이블.이 생략할수 있다.

 

복습:

SELECT 칼럼 AS 별칭 FROM 테이블 WHERE 칼럼 LIKE '^\w+@\w+.(org|com|net)$';
INSERT INTO 테이블(칼럼,칼럼) VALUES(값,값);
UPDATE 테이블 SET 칼럼='값',칼럼='값';

 

공부시간 2시간.

순공부시간 1시간.

 

세상에서 제일 행복한 사람은 혼자서도 행복한 사람이다. 의존적인 삶을 살지말자. 공부를 루틴처럼 하자.