Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 N번째 최댓값을 찾는 쿼리 작성 방법

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로 지정하면 됩니다. 이 방법은 서브쿼리 없이도 간결하게 순위별 값을 조회할 수 있어 실무에서 유용하게 활용됩니다.