일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Java
- unboxing
- 콜렉션
- 빌드
- 싱글톤
- 메소드
- maven
- suvlet
- 무한
- 클래스
- bootstrap
- Short
- 제네릭
- boxing
- wrapper
- 내장객체
- https://start.spring.io
- 컬렉션
- 제너릭
- 박싱
- 스프링
- 언박싱
- 싱글턴
- Scanner
- 루프
- 자동형변환
- start.spring.io
- Jenkins
- dependency
- 인텔리제이
- Today
- Total
Developer Gonie
Oracle에서 rownum을 이용한 where절 작성시 1을 반드시 포함해야 하는 이유 본문
아무런 결과가 나올 수 없는 쿼리문
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을 포함시켜야 한다.
'개인 공부 > Oracle' 카테고리의 다른 글
UNION ALL, UNION (쿼리문의 결과를 합치는 연산) (0) | 2023.04.17 |
---|---|
MERGE INTO 문(ON절의 조건에 따른 분기 실행) (0) | 2023.03.31 |
CASE WHEN ~ THEN ~ ELSE END (0) | 2023.03.31 |
참고하고있는 것 무시하고 삭제, 참고하고 있는 것들도 자동 삭제 (0) | 2022.09.21 |