티스토리 뷰
SELECT를 사용하여 결과집합을 조회하게 되면 만들지 않은 ROWNUM이 자동으로 생기게 됩니다. 왼쪽에 있는 빨간색 사각형이 ROWNUM에 해당하는 부분입니다.
SELECT * FROM NOTICE;
상위 5개의 결과만 보기 위해서 다음과 같은 SQL을 사용할 수 있습니다.
SELECT * FROM NOTICE WHERE ROWNUM BETWEEN 1 AND 5;
6번째부터 10번째를 조회하려면 위 내용을 응용해 다음과 같이 작성하면 된다고 생각할 수 있습니다.
SELECT * FROM NOTICE WHERE ROWNUM BETWEEN 6 AND 10;
하지만 아무것도 출력되지 않았습니다. 왜 이런 현상이 발생할까요?
ROWNUM은 결과집합을 만든 후 하나하나 넘버링 하는 것이 아니기 때문입니다.
SELECT를 사용했고 결과집합을 가져오기 직전의 상태입니다. 기본적으로 ROWNUM은 1이 있는 것을 알 수 있습니다. 이 상태에서
WHERE ROWNUM>=2;
와 같은 절이 추가적으로 있다면 현재 ROWNUM이 1이므로 결과집합에 정보를 가져올수 없습니다. 만약
WHERE ROWNUM>=1;
이 있었다면 데이터를 가져오는데에 성공하고 결과집합은 다음과 같은 상태가 될 것입니다.
다음과 같이 작성하여 6번째부터 10번째 정보를 가져와야 합니다.
SELECT * FROM (SELECT ROWNUM AS NUM,NOTICE.* FROM NOTICE) WHERE NUM BETWEEN 6 AND 10;
소괄호에 있는 내용을 살펴보겠습니다.
SELECT ROWNUM AS NUM, NOTICE.* FROM NOTICE;
AS는 별칭을 사용하는 것임을 알 수 있고, 처음보는 것은 에스터리스크에 NOTICE.가 추가적으로 있는 것입니다.
에스터리스크는 기본적으로 '모든'을 나타내므로 다음과 같이 사용하면 ROWNUM을 중복으로 포함하므로 에러를 발생합니다.
SELECT ROWNUM,* FROM NOTICE;
즉 NOTICE.*를 통해 범위를 명시하여 ROWNUM과 겹치지 않도록 해야합니다.
소괄호에 있는 SQL을 실행하면 다음과 같은 결과집합이 만들어집니다. NUM COLUMN이 추가적으로 생긴 것을 알 수 있습니다.
별칭을 사용하지 않고 그대로 ROWNUM을 사용하게 되면 소괄호에 있는 명시적인 ROWNUM을 사용하는 것이 아닌 자동으로 만들어주는 ROWNUM을 우선적으로 사용하게 됩니다.
출처
'Oracle' 카테고리의 다른 글
[Oracle] Join (0) | 2021.01.05 |
---|---|
[Oracle] SELECT 구절 순서 (0) | 2021.01.05 |
[Oracle] 데이터 타입 (0) | 2021.01.03 |
[Oracle] transaction 처리를 위한 COMMIT과 ROLLBACK (0) | 2021.01.03 |
[Oracle] Listener refused the connection with the following error : ORA-12505 오류 (0) | 2021.01.03 |
- Total
- Today
- Yesterday
- knapsack
- 이분탐색
- implementation
- sweeping
- Oracle
- greedy
- Segment tree
- bfs
- Suffix Array
- union find
- Fenwick
- 좌표압축
- dfs
- 스위핑
- SCC
- dijkstra
- DP
- spring
- 이분매칭
- 펜윅트리
- 트라이
- sorting
- hld
- 2-SAT
- 동적계획법
- 정렬
- spring boot
- string
- kmp
- 세그먼트트리
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |