- Oracle DataBase와 MariaDB, MySql은 페이징 처리를 할 때 사용하는 쿼리가 다르다 코드를 보며 차이점을 확인해 보자
- MariaDB / MySQL
-
SELECT * FROM [테이블 명] ORDER BY [정렬 기준 컬럼] [DESC | ASC] LIMIT [시작 행번호] OFFSET [출력 갯수]
- 위와 같이 쿼리의 구조를 잡을 수 있다.
- Mariadb, MySQL은 LIMIT을 통해 출력된 결과물을 원하는 개수만큼 가져올 수 있다.
-
SELECT * FROM BOARD ORDER BY BOARD_IDX DESC LEMIT 0 OFFSET 10
- 위의 코드는 게시글 테이블에서 역순으로 정렬 후, 정렬 결과에서 0번부터 10개의 게시물을 가져온다는 쿼리이다.
- Oracle
-
SELECT * FROM (SELECT [정렬한 테이블 별칭].*, rownum rownum_ FROM (SELECT * FROM [테이블 명] ORDER BY [정렬 기준 컬럼 명] [DESC | ASC]) [정렬 한 테이블 별칭]) WHERE rownum_ > [시작 행 번호] AND rownum_ <= [끝 행 번호]
- 오라클은 위의 두 데이터베이스보다는 쿼리가 복잡하다.
- LIMIT라는 기능이 없는 것도 있지만 정렬을 먼저 하고 rownum의 조건을 잡을 수 없기 때문이다.
- where절이 실행이 되고 order by절이 실행되는데 순서를 바꿔서 실행할 방법이 없으므로 서브 쿼리를 사용해 정렬을 한 후 rownum과 테이블을 합치는 서브쿼리를 만들어주고 그 뒤에 rownum으로 시작 행부터 끝 행까지를 잡아준다.
-
SELECT * FROM (SELECT row_.*, rownum rownum_ FROM (SELECT * FROM BOARD ORDER BY BOARD_IDX DESC) row_) WHERE rownum_ > 0 AND rownum_ <= 10
- 다른 방법으로는 아래의 방법을 사용할 수 있다 / ROW_NUMBER()함수와 OVER()함수 사용
-
SELECT s.* FROM (SELECT ROW_NUMBER() OVER(ORDER BY [정렬 기준 컬럼명] desc) RNUM, [테이블 alias].* FROM [테이블 명] [테이블 alias]) s WHERE s.RNUM BETWEEN [시작 행] AND [끝 행]
'강의 자료 > JSP' 카테고리의 다른 글
게시판 더미 데이터 생성 (0) | 2021.10.18 |
---|---|
Database 검색 쿼리 (0) | 2021.10.18 |