개인 공부/Oracle

Oracle에서 rownum을 이용한 where절 작성시 1을 반드시 포함해야 하는 이유

이대곤 2022. 10. 19. 00:55

아무런 결과가 나올 수 없는 쿼리문

select /*+INDEX_DESC(tbl_board pk_board)*/ rownum, bno, title, content
from tbl_board
where rownum > 10 and rownum <= 20;

 

아무런 결과가 나오지 않은 이유

where절에서 사용한 rownum관련 조건이 1을 포함하지 않았기 때문 

 

좀 더 자세한 설명

0) 아래와 같이 where절은 없지만 rownum을 포함하는 쿼리문이 존재한다고 가정하자

select /*+INDEX_DESC(tbl_board pk_board)*/ rownum, bno, title, content
from tbl_board

1) 그럼 먼저 rownum을 고려하지 않고,아래의 쿼리문이 먼저 실행됨.

select /*+INDEX_DESC(tbl_board pk_board)*/ bno, title, content
from tbl_board

2) 순차적으로 레코드 하나하나에 rownum 번호 부여
    첫번째로 찾아진 레코드에 1번 부여,
    두번째로 찾아진 레코드에 2번 부여,
    세번째로 찾아진 레코드에 3번 부여,
    ...

    이런식으로 찾아진 모든 레코드에 번호가 1씩 증가하며 전부 부여
    단, 앞 레코드의 ROWNUM 번호가 할당 되어야 
    다음 레코드의 ROWNUM 번호가 할당될 수 있다.(증가할 수 있다)

 

3) 이 작업이 마무리되면 쿼리문의 결과에 ROWNUM이 보여진다.


그렇다면 왜 맨 위의 쿼리문에서 아무런 결과가 나오지 않았는지 살펴보자.

where절을 제외했을 때 쿼리문의 결과로 아래와 같은 레코드가 나왔다고 치자.
a
b
c

첫번째 레코드에 ROWNUM 1번을 부여하려고 시도.
그러나 where 절의 ROWNUM > 10 에 부합하지 않아
ROWNUM이 증가하지 않으며, 해당 레코드를 제외시킴 
1 a
  b
  c

다시 첫번째 레코드에 ROWNUM 1번을 부여하려 시도.
그러나 where 절의 ROWNUM > 10에 부합하지 않아
ROWNUM이 증가하지 않으며, 해당 레코드를 제외시킴
1 b
  c

다시 첫번째 레코드에 ROWNUM 1번을 부여하려 시도.
그러나 where 절의 ROWNUM > 10에 부합하지 않아
ROWNUM이 증가하지 않으며, 해당 레코드를 제외시킴
1 c

결국 모든 레코드를 순회하나 아무런 결과가 남지 않게 됨.

따라서, ROWNUM을 활용한 WHERE 절을 작성할 땐
반드시 1을 포함시켜야 한다.