티스토리 뷰

JDBC

페이징을 위한 쿼리 만들기

Programmers 2021. 5. 6. 08:52
반응형

목표
: 페이징을 위한 쿼리 만들기

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

 

SQL 튜닝 - ROWNUM 성능 개선

ROWNUM 이해 - oracle에서 제공하는 가상 컬럼 - select 절에서 사용시 추출하는 데이터의 순번을 부...

blog.naver.com



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.*컬럼을 받아와야한다. 

최신글 순으로 출력 오류1

 

SELECT * FROM NOTICE ORDER BY REGDATE DESC;

최신글 순으로 출력 오류1 화면과 지금의 코드결과에서 1~10까지의 결과는 같아야한다.
하지만 그렇지 않음.

최신글 순으로 출력 오류2

시도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
댓글
공지사항