예전에 게시판을 구현했을 때 페이징 처리를 해야 할 일이 있었습니다. 어떻게 처리할 지 고민하다가, limit와 offset 조합으로 처리하였던 기억이 납니다. 컬럼 수가 그리 많지 않다면, 시도해 보아도 괜찮은 방법 중 하나입니다. 실제로, 해커랭크나, 다른 사이트 sql 문제들을 풀고 나서, 다른 분들의 코드를 보면 limit는 정말 많이 볼 수 있음을 알 수 있습니다. 특히 rank 관련해서요.

 

 예를 들어서, 모든 사람들의 score 값이 다 다를 때, k위를 한 사람을 구하는 쿼리를 쓸 때, 정렬하고 offset, limit 조합을 쓰면 너무 쉽게 처리할 수 있습니다. 


  예제 상황을 가지고 오겠습니다.

 

 

 dbeaver의 예제 데이터 베이스에는, Album 테이블이 있습니다.

 

 

 그리고, Track이 있습니다. 트랙에는 AlbumId가 같이 있습니다. 저는 이 두 테이블을 가지고, 앨범당 몇 개의 트랙이 수록되어 있는지를 보려고 합니다. 그리고, 이것을 수록된 트랙이 많은 앨범 순으로, 그것이 같다면 타이틀 오름차순으로 정렬하려고 합니다.

 

 

 그러면 이렇게 쓰시면 되는데요. 뭔가 이해가 안 가는 점이 있을 겁니다. db 교과서에는, having 다음에 select절이 해석된다. 여기까지만 했을 거에요. order by가 언제 해석되는지는, 공식 문서를 보면 나와 있을 텐데요. 여기에서는 sqlite를 사용하였습니다. 그러니, 이 문서를 보면 될 듯 싶어요.

 

 

 여기서, 2위까지 뽑고 싶습니다. 위에서 1번째, 2번째까지. 즉 cc가 57, 34까지만 나와야 합니다. 어떻게 하면 좋을까요? 이 때 limit를 쓸 수 있습니다. 이것은 k번째 rank까지 뽑아내는 데 유용하게 쓰입니다. 정렬과 같이 썼다면요. 단순히, 출력할 컬럼수를 제한할 때 쓰이기도 합니다.

 

 

 limit 2를 추가해 보겠습니다.

 

 

 그러면 cc값이 57, 34인 것이 나왔음을 알 수 있습니다.

 


 뒤에 offset이 붙으면 뭘 의미할까요? 이것은 기준 위치를 의미합니다. offset을 1로 두고, 위에서부터 2개의 원소를 뽑아 보겠습니다.

 

 

 그러면 34, 30이 나옴을 알 수 있는데요. 이는 2등, 3등이 나왔다는 의미입니다. 배열로 치면, cc값이 34인 것이 1번째 위치에 있었으니, 1번째부터 2개를 뽑아낸 셈이 됩니다.

 

 

 그러면 위 쿼리는 어떻게 해석하면 좋을까요? offset이 10입니다. 그리고, cc 내림차, Title 오름차로 정렬되어 있습니다. 그러면, 정렬 기준에 따라 정렬된 결과에서, 11위부터 20위까지 출력했다고 해석하시면 됩니다.

 

 

 13위부터, 18위까지 보시면, 22, 22, 22, 21, 21, 20 패턴으로 cc가 내려감을 알 수 있습니다.

 

 

 3위부터 8위까지 보시면 22, 22, 22, 21, 21, 20 이 패턴으로 내려가는 게 같습니다. 심지어 Title까지 같습니다. 데이터 수가 크지 않다면, limit와 offset 조합으로 페이징 처리를 쉽게 할 수 있다는 이야기입니다.