MSSQL - TOP(출력 행 제한), OFFSET FETCH(페이징 처리)

반응형

 

(출력 갯수, 결과 값 설정, 제한하기)

쿼리 페이징 솔루션

TOP

TOP이란?

  • 전체 중 일부분의 행만 가져올 때 사용
  • top 키워드를 사용하여 결과값 출력을 제한 할 수 있음
    • MySQL의 limit와 동일한 기능 수행
  • top 키워드는 select 구문의 컬럼 앞에 출력 할 행의 숫자와 함께 명시
    • top n : 출력 갯수 : 첫번째 행 ~ n번째 행 (지정한 숫자)

기본 SQL 쿼리 출력 구문

  • 해당 테이블의 모든 조회 결과를 출력
select * from table

 

  • 예시) 특정 테이블의 결과 조회하기
select * from MyPet


TOP 키워드를 사용한 SQL 쿼리 출력 구문

데이터 특정 몇개만 가져오기

  • 해당 테이블의 n번째까지의 조회 결과를 출력
select top N column from table

 

  • 예시) 특정 테이블의 결과 중 첫번째 데이터만 조회하기
select top 1 * from MyPet


데이터 퍼센트로 가져오기

  • 해당 테이블에서 조회 결과를 n퍼센트만큼 출력
  • 정수의 소수점일 경우, 반올림
select top N PERCENT from table

 

  • 예시) 특정 테이블의 결과 데이터를 50%만 조회하기
-- 테이블의 결과 50%의 데이터만 조회
select top 50 percent * from MyPet


OFFSET FETCH

OFFSET FETCH란?

  • 쿼리 페이징 솔루션을 구현하고 클라이언트 애플리케이션으로 보내는 행의 수를 제한 할 때 사용
    • 즉, 페이지당 n개의 데이터를 보여주도록 설계 할 때 사용
      • 예시) 페이지당 10개의 게시글을 보유한 게시판의 페이징 처리
        • 1페이지 = 쿼리 실행시 행의 수가 10개인 1~10행
        • 2페이지 = 쿼리 실행시 행의 수가 10개 증가된 11~20행
        • ... 반복
  • TOP 절에서 반환되는 행의 수를 제한 하기 어려우므로 OFFSET FETCH 절을 사용하여 페이징 처리를 함
  • MySQL에서의 limit, offset과 동일한 기능 수행

OFFSET FETCH를 이용한 페이징 처리

  • 기본 데이터 테이블
select * from MyPet


OFFSET FETCH 구문

  • 구문이 ORDER BY 절 다음에 위치
    • 즉, ORDER BY 없이는 사용 할 수 없음
  • offset n rows : n번째 행부터 조회
    • 주의 : 수는 인덱스를 기준으로 입력
      • 예시) 5번째 행 = offset 4 rows
  • fetch next m rows only : m개의 데이터 조회
    • n번째 행부터 m개의 데이터를 조회한다는 의미
    • 이를 이용하여 페이징 처리를 할 수 있음
select * from table
order by COL
	offset n rows
    fetch next m rows only;

페이징 처리

  • 예시) 1페이지당 5개씩 데이터를 출력해보기
    • 변수 선언& 초기화 : 페이지 수의 값과 데이터 갯수의 값
    • 페이징 처리시 : 페이지의 수를 나타내는 변수의 값 변경
      • 해당 포스팅에서는 이해를 돕고자 0과 1의 수로 하드코딩하였습니다.
      • offset 페이징 부분 설명
        • 인덱스는 0부터이므로 0번째 행부터 n개의 데이터를 조회하도록 해야 함
        • 즉, n개의 행을 곱하면 n개씩 증가 (인덱스=0, 데이터=5개씩 > 0, 5, 10 ...)
/*
Paging Solution:
페이징 처리를 위한 변수 선언과 값 초기화
    @page : 페이지의 수, 페이지는 0부터 시작 (1페이지: 인덱스 0번부터 5개)
    @dataCnt : 출력되는 데이터의 수
order by 절 기준 컬럼
    id(identity)를 순서대로 페이지당 5개의 데이터 출력
*/

-- 1페이지, 변수 선언 및 값 설정
declare @page int
set @page = 0;
declare @dataCnt int
set @dataCnt = 5;

-- 1페이지 조회
select * from MyPet
order by id
offset @page*@dataCnt rows
fetch next @dataCnt rows only;


-- 2페이지, 변수 값 설정 : 페이지 수 변경
set @page = 1;

-- 2페이지 조회
select * from MyPet
order by id
offset @page*@dataCnt rows
fetch next @dataCnt rows only;

 


참고

  • Microsoft - SQL문서 - TOP(Transact-SQL)

https://learn.microsoft.com/ko-kr/sql/t-sql/queries/top-transact-sql?view=sql-server-ver16 

 

TOP(Transact-SQL) - SQL Server

TOP(Transact-SQL)

learn.microsoft.com

 

  • Microsoft - SQL문서 - SELECT - ORDER BY 절(Transact-SQL)

https://learn.microsoft.com/ko-kr/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-ver16 

 

ORDER BY 절(Transact-SQL) - SQL Server

SELECT - ORDER BY 절(Transact-SQL)

learn.microsoft.com

 

반응형