9월 4일 수업 과정 - 가상컬럼 ROWNUM

 데이터 정렬. 


tool에서 제공해주는 행의 번호를 column으로 갖을 수는 없을까? 

      EMPNO

1      7369

2      7499

3

4

5

6

7

8



여기서 행의 번호를 EMPNO같이 column으로 갖으려면? 



*실무에서 매우 많이 사용* 

데이터 정렬 ( 가상컬럼 ROWNUM ) - 페이징 처리를 위해 


- ROWNUM  : 행의 번호를 부여해주는 가상 컬럼

       SELECT QUERY 에 의해 조회된 순서대로 부여된 가상 숫자 컬럼 

** 조회된 순서대로 번호를 부여 


1. 첫번째 특징 where 절에 사용하는 것이 가능 


SELECT ROWNUM, empno, ename

FROM emp; 


데이터 정렬 ( 가상컬럼 ROWNUM ) 


WHERE 절에서도 사용이 가능하다. 

단 다음의 형태만 가능하다. 

- WHERE ROWNUM = 1 (동등 비교연산의 경우 1만 가능 )  

-WHERE ROWNUM은 1번부터 읽는 것만 가능하다. 즉 WHERE ROWNUM = 3 , 3을 가지고 오라고 해도 오라클에서는 1, 2 부터 읽어야 하기 때문에 안된다. 

-WHERE ROWNUM <= 15 

WHERE ROWNUM BETWEEN 1 AND 15 

- WHERE ROWNUM <= n 

- WHERE ROWNUM < n

-BETWEEN 1  AND 10 



-> ROWNUM은 1번부터 순차적으로 데이터를 읽어 올 때만 사용 가능하다. 



문제가 발생 : 메모리가 한정되어 있기 때문에, 한 화면에 다 보여주기가 쉽지 않다. ( 한 화면에 많은 데이터 저장이 좋지 않다. -> 한 페이지에 제한된 숫자만 보여주는것 -> 페이징 처리 ) 



2. 2번째 특징 :  ORDER BY 결과를 반영하려면 inline view 를 사용한다. 

ORDER BY 절은 SELECT 이후에 실행된다. 

** SELECT 절에 ROWNUM을 사용하고 ORDER BY 절을 적용하게 되면 원하는 결과를 얻지 못한다. 


1. SELECT *

2. FROM emp

3. WHERE deptno in ( 10, 30 ) 

    AND sal > 1500 

4. ORDER BY ename DESC;


2번 -> 3번 -> 1번  -> 4번 순서로 읽혀진다. 


SELECT ROWNUM, empno, ename 


FROM emp 


ORDER BY ename;


---> SELECT 절이 ORDER 절보다 먼저 수행이 되기 떄문에 꼬여버리는것. 

정렬을 먼저 하고 (ORDER) -> 정렬된 결과에 ROWNUM을 적용해야 깔끔하게 보임. 


문제 해결 : INLINE-VIEW 

              : select 결과를 하나의 테이블처럼 만들어주는것. 

정렬을 먼저하고, 정렬된 결과에 , ROWNUM 을 적용시켜 번호를 매겨줘야 깔끔하게 보임 


SELECT * 

FROM (SELECT ROWNUM RN, a.*

                FROM (SELECT empno, ename

                              FROM  emp

                 ORDER BY name ) a ) 

WHERE RN BETWEEN 6 AND 10 ; 


가로쳐준게 emp가 되어 주는것 


-사원정보를 페이징해보자 

1. 페이지에 5명씩 나온다. 

1페이지 : 1~5 2페이지 : 6~10, 3페이지 : 11~ 15 

1페이지에 5명씩 조회 


 (page-1)*pageSIZE + 1 ~ page * pageSize  -> 그 페이지에 있는 숫자순서 범위 



1페이지 : 1 ~ 5 5명씩 조회 

2페이지 : 6 ~ 10

3페이지 : 11 ~ 15 



SELECT * 

FROM  

        SELECT ROWNUM rn , a.* 

         FROM

                   (SELECT empno, ename 

                    FROM emp 

                    ORDER BY ename ) a )

WHERE rn BETWEEN ( : PAGE - 1) * pageSize + 1  AND : page * pageSize; 


SELECT ROWNUM, *

FROM emp; 

WHERE ROWNUM BETWEEN 6 AND 10;

WHERE rn BETWEEN ( : page -1)* : pageSize + 1 AND : page * : pagesize;

SELECT 절에 *을 사용했는데 , 를 통해 다른 특수 COLUMN이나 EXPRESSION을 사용할 경우는 *앞에 해당 데이터가 어떤 테이블에서 왔는지 명시를 해줘야 한다. 


(한정자 ) 

별칭은 테이블에도 적용이 가능하다. 단 COLUMN이랑 다르게 AS 옵션은 없다. 


SELECT ROWNUM, e.*

FROM emp e;



댓글