티스토리 뷰
목표
: 페이징을 위한 쿼리 만들기
Notice테이블 출력
SELECT * FROM NOTICE;
실행결과의 일련번호가 필요하다.
일렵번호를 ROWNUM을 사용해 출력
SELECT ROWNUM, NOTICE.* FROM NOTICE;
10줄만 출력을 위한 필터링 WHERE
SELECT ROWNUM, NOTICE.* FROM NOTICE
WHERE ROWNUM BETWEEN 1 AND 10;
2~10까지는 출력 불가.
이유
: rownum은 sql결과 셋에 순서를 부여하는 가상컬럼이다. fetch단계에서 추출하는 첫번째 row에 1을 부여하고, 이후 row가 추출될때마다 rownum의 값을 순차적으로 증가시킨다.
하지만 이 쿼리문에서는 rownum을 1-10까지 순서대로 증가시킬 경우라 출력이 가능하지만, 2-10까지를 출력하려고 한다면 첫 row1을 찾지 못해 출력이 불가능하다.
blog.naver.com/cjsong/221590745740
ROWNUM가 WHERE절 전에 사용되도록 서브쿼리를 이용
SELECT * FROM (SELECT ROWNUM NUM, NOTICE.* FROM NOTICE)
WHERE NUM BETWEEN 2 AND 10;
서브쿼리 ROWNUM의 별명 NUM만들고 메인 쿼리에서 모두 받아와서 NUM을 2부터 10까지 출력
최신글부터 받기 위해서 REGDATE를 이용한 정렬
시도1. 실패1
SELECT * FROM (SELECT ROWNUM NUM, NOTICE.* FROM NOTICE ORDER BY REGDATE DESC)
WHERE NUM BETWEEN 1 AND 10;
notice 테이블의 rownum과 notice.*모든 컬럼을 선택 후 regdate의 역순으로 정렬을 한 후 1-10까지의 rownum의 모든 행을 출력. rownum의 순서가 얽힌다.
문제점: notice테이블을 먼저 역순으로 정렬 후 rownum과 notice.*컬럼을 받아와야한다.
SELECT * FROM NOTICE ORDER BY REGDATE DESC;
최신글 순으로 출력 오류1 화면과 지금의 코드결과에서 1~10까지의 결과는 같아야한다.
하지만 그렇지 않음.
시도2. 실패2
SELECT * FROM (
SELECT ROWNUM NUM, NOTICE.* FROM (
SELECT * FROM NOTICE ORDER BY REGDATE DESC
)
)
WHERE NUM BETWEEN 1 AND 10;
서브쿼리를 하나 더 만들어서 notice테이블을 받아와 regdate의 역순으로 받아온 후 rownum의 1-10까지를 받아와서 rownum과 notice.*컬럼을 출력.
문제점: 서브쿼리 SELECT ROWNUM NUM, NOTICE.* FROM에서 NOTICE가 아니라 서브쿼리가 되어야 한다.
해결방법: SELECT * FROM NOTICE ORDER BY REGDATE DESC 문장을 별칭으로 만들자.
시도3. 성공
SELECT * FROM (
SELECT ROWNUM NUM, N.* FROM (
SELECT * FROM NOTICE ORDER BY REGDATE DESC
) N
)
WHERE NUM BETWEEN 1 AND 10;
N이라는 별칭을 통해 서브쿼리를 받아 다음 서브쿼리에 전달해준다.
정상적으로 작동하는 것을 확인.
'JDBC' 카테고리의 다른 글
이전 / 다음 구현하기 (0) | 2021.05.07 |
---|---|
페이징 쿼리 이용하기 (0) | 2021.05.06 |
공지사항 메뉴 붙이기 (0) | 2021.05.03 |
사용자 인터페이스 붙이기(공지사항 목록) (0) | 2021.05.03 |
CRUD를 담당하는 NoticeService 생성 (0) | 2021.05.03 |