Oracle SQL | Rownum

suyeon·2022년 4월 29일
0

Oracle SQL

목록 보기
3/6
post-thumbnail

220428

Pseudo Column, 의사컬럼

실제 컬럼이 아닌데 컬럼처럼 행동하는 객체

  • 함수처럼 행동한다.

Rownum⭐

SELECT문에서 행번호를 부여한다.

  • from절이 실행될 때 각 레코드에 rownum을 할당한다. ★★★
  • where절의 영향을 받아 reindexing을 한다.(=유동적) ★★★
  • rownum을 사용 시 서브쿼리를 자주 사용한다. ★★★
  • 게시판 페이지번호에 사용된다.
-- 각각 비교해보세요.
select 
    name, buseo,     -- 컬럼(속성)   > output > 객체의 특성에 따라 다른 값을 가진다.
    rownum,          -- 의사 '컬럼'  > output > 컬럼의 모습이나 특성과 가장 유사함.
    substr(name, 2), -- 함수         > input + output > 객체의 특성에 따라 다른 값을 가진다.
    sysdate,         -- 함수         > output > 모든 레코드가 동일한 값을 가진다. 너나할거 없이 모두 같은 값
    '상수'            -- 상수         > 모든 레코드가 동일한 값을 가진다. 너나할거 없이 모두 같은 값
from tblInsa;
-- 게시판 > 페이지
-- 1페이지 > rownum between 1 and 20
-- 2페이지 > rownum between 21 and 40

-- !!1부터 순차적으로 결과를 가지고 오는것만 가능!!
select name, buseo, rownum from tblInsa where rownum = 1;
select name, buseo, rownum from tblInsa where rownum <= 5;

select name, buseo, rownum from tblInsa where rownum = 10; -- x
select name, buseo, rownum from tblInsa where rownum > 5; -- x


select name, buseo, rownum  -- 2. 소비 > 1에서 이미 할당된 숫자를 rownum 표현을 통해서 가져온다. > 여기서 rownum 생성하는거 X
from tblInsa;               -- 1. 생성 > from절 실행되는 순간 모든 레코드의 rownum이 할당된다.


select name, buseo, rownum  -- 3. 소비
from tblInsa                -- 1. 생성 
where rownum = 1;           -- 2. 조건 > 1에서 생성된 번호를 조건으로 검색


-- where절의 영향을 받아 reindexing을 한다.(*************) > 이것때문에 불가능
select name, buseo, rownum  -- 3. 소비
from tblInsa                -- 1. 생성 
where rownum = 3;           -- 2. 조건 > 1에서 생성된 번호를 조건으로 검색
-- rownum 쿼리당 1번씩 실행.
-- 아래의 절에서는 rownum 2개, rnum - 서브쿼리, rownum - 외부쿼리
select 
    name, buseo, basicpay,
    rownum, -- B절의 행번호
    rnum
from (select -- B절
            name, buseo, basicpay, 
            rownum as rnum -- A절 실행될 때 할당된 행번호
       from tblInsa -- A절
               order by basicpay desc)
                where rownum <= 3; -- 하나의 테이블이라고 생각

-- rnum(고정), rownum(계산)
select name, buseo, basicpay, rnum, rownum 
from (select 
            name, buseo, basicpay,
            rownum as rnum
        from (select 
                    name, buseo, basicpay
               from tblInsa 
                       order by basicpay desc)) -- rnum 고정시키기 위해서
                            where rnum >=3 and rnum <=7;

이것만 이해하면 ok ★★★

-- 고객 명단 > 페이지 단위 출력 > 10명씩
select * from tblAddressBook;

-- 1. 원하는 정렬 > order by한 쿼리는 rownum 쓸모 없음
select * from tblAddressBook order by name;

-- 2. 1을 인라인 뷰로 생성 + rownum 생성 + 별칭 사용
select a.*, rownum as rnum from (select * from tblAddressBook order by name) a;

-- 3. 2를 인라인 뷰로 생성 + 사용 (rnum 고정)
select * from (select a.*, rownum as rnum from (select * from tblAddressBook order by name) a)
    where rnum between 1 and 10;

select * from (select a.*, rownum as rnum from (select * from tblAddressBook order by name) a)
    where rnum between 11 and 20;

select * from (select a.*, rownum as rnum from (select * from tblAddressBook order by name) a)
    where rnum between 21 and 30;


-- 반복적으로 사용할거면 뷰 생성
create or replace view vwAddressBook
as
select a.*, rownum as rnum from (select * from tblAddressBook order by name) a;

select * from vwAddressbook where rnum between 31 and 40;

🙋‍♂️ 마무리

rownum은 From절에서 생성, where절에서 reindexing

0개의 댓글