MySQL에서 테이블의 N번째 최댓값(예: 두 번째로 큰 값, 세 번째로 큰 값)을 구해야 하는 경우가 종종 있습니다. 이럴 때 ORDER BY 절과 LIMIT 절의 오프셋 기능을 함께 사용하면 간단하게 해결할 수 있습니다. 이 글에서는 예제를 통해 그 방법을 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 실습에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> Value int
-> );
Query OK, 0 rows affected (0.59 sec)2. 데이터 삽입
INSERT 명령어를 사용하여 테이블에 여러 개의 레코드를 추가합니다.
mysql> insert into DemoTable values(40); Query OK, 1 row affected (0.26 sec) mysql> insert into DemoTable values(60); Query OK, 1 row affected (0.09 sec) mysql> insert into DemoTable values(45); Query OK, 1 row affected (0.11 sec) mysql> insert into DemoTable values(85); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable values(78); Query OK, 1 row affected (0.10 sec)
3. 전체 레코드 조회
SELECT 문으로 테이블에 저장된 모든 레코드를 확인합니다.
mysql> select * from DemoTable;
위 쿼리는 다음과 같은 결과를 출력합니다.
+-------+ | Value | +-------+ | 40 | | 60 | | 45 | | 85 | | 78 | +-------+ 5 rows in set (0.00 sec)
4. N번째 최댓값 찾기
N번째 최댓값을 찾는 핵심 쿼리는 다음과 같습니다.
mysql> select * from DemoTable order by Value desc limit 2,1;
실행 결과는 다음과 같습니다.
+-------+ | Value | +-------+ | 60 | +-------+ 1 row in set (0.00 sec)
쿼리 동작 원리
이 쿼리가 어떻게 동작하는지 살펴보겠습니다.
- ORDER BY Value DESC:
Value열을 내림차순으로 정렬합니다. 정렬 순서는 85 → 78 → 60 → 45 → 40입니다. - LIMIT 2,1: 첫 번째 숫자인
2는 건너뛸 행의 수(오프셋)를 의미하고, 두 번째 숫자인1은 반환할 행의 수를 의미합니다. 즉, 상위 2개 행을 건너뛰고 세 번째 값을 하나만 가져옵니다.
따라서 위 쿼리는 두 번째로 큰 값인 78을 건너뛰고 세 번째로 큰 값인 60을 반환합니다.
응용 방법
같은 원리로 다른 순위의 값을 구할 수 있습니다.
- 두 번째 최댓값:
ORDER BY Value DESC LIMIT 1,1 - 네 번째 최댓값:
ORDER BY Value DESC LIMIT 3,1 - N번째 최댓값:
ORDER BY Value DESC LIMIT N-1,1
일반화하면, N번째 최댓값을 구하려면 오프셋을 N-1로 지정하면 됩니다. 이 방법은 서브쿼리 없이도 간결하게 순위별 값을 조회할 수 있어 실무에서 유용하게 활용됩니다.