페이징

조예빈·2024년 4월 5일
0

Oracle

목록 보기
12/26
post-custom-banner

정렬이던 필터링이던 자바 코드 등을 사용하는 것이 아닌, DB에서 하는 것이 가장 빠름 -> 데이터가 한 곳에 있기 때문

  • 페이징 과정에서 SubQuery가 필요함
  • MySQL은 limit를 사용하면 됐지만, Oracle에는 limit가 없어서 SubQuery를 사용해야 함
    -페이지 별 sql문을 만들 수 없으니까 큰 틀 하나를 만들고, 프로그램에서 가져와서 사용함 => 백엔드에서는 SQL을 동적으로 사용할 수 있도록 만드는 것이 중요함

인터넷에 잘못된 정보가 많기 때문에 주의!!

페이징 처리 알고리즘

  • 총 100개, 1 페이지 당 10개씩 나온다고 가정
    • 1페이지 : 1~10까지
    • 2페이지 : 11~20까지

공식

  • 시작값 : (페이지번호-1) * 페이지 당 개수+1
  • 끝 값 : 페이지번호 * 페이지 당 개수

    시작값은 해당 페이지에서 보여질 첫 번째 항목의 인덱스를 나타내며, 페이지 번호를 이용하여 시작값을 계산. 페이지 번호가 1부터 시작하기 때문에 1을 빼고, 페이지 당 항목 수를 곱하여 이전 페이지에서 보여진 항목 수 고려. 이후 1을 더하여 항목 인덱스가 0이 아닌 1부터 시작하도록 보정

끝 값은 해당 페이지에서 보여질 마지막 항목의 인덱스를 나타내며, 페이지 번호와 페이지 당 항목 수를 곱하여 계산. 페이지 번호가 1부터 시작하기 때문에 그대로 사용하며, 페이지 당 항목 수를 곱하여 페이지에서 보여질 총 항목 수를 고려

  • 위의 공식은 MySQL에서는 적용이 안됨. 오라클에서만 적용 가능
  • 면접에서 '설명' 이 중요함

정렬 안 한 버전 예시

SELECT ROWNUM, STUDNO, NAME
FROM STUDENT
ORDER BY STUDNO;


-> ROWNUM이 배정된 후 ORDER BY가 실행되기 때문에 ROWNUM의 순서가 뒤죽박죽임

SELECT ROWNUM, A.* 
FROM(
SELECT STUDNO, NAME
FROM STUDENT
ORDER BY STUDNO
) A;


-> 정렬 후 ROWNUM을 배정하면 됨

SELECT ROWNUM, A.* 
FROM(
  SELECT STUDNO, NAME
  FROM STUDENT
  ORDER BY STUDNO
) A
WHERE ROWNUM BETWEEN 1 AND 10; 


-> 이 경우 ROWNUM에 별칭을 주면 로직이 제대로 실행되지 않음

SELECT * FROM(
    SELECT ROWNUM RNUM, A.* 
    FROM(
        SELECT STUDNO, NAME
        FROM STUDENT
        ORDER BY STUDNO
    ) A
) B
WHERE B.RNUM BETWEEN 11 AND 20; 


-> 이렇게 한 번 더 감싸주면 별칭을 사용할 수 있음

profile
컴퓨터가 이해하는 코드는 바보도 작성할 수 있다. 사람이 이해하도록 작성하는 프로그래머가 진정한 실력자다. -마틴 파울러
post-custom-banner

0개의 댓글