- 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

+ Recent posts