MySQL에서 N번째로 높은 값 선택하기
데이터 분석이나 시험 성적 처리 등을 하다 보면 테이블에서 N번째로 높은 값을 찾아야 하는 경우가 자주 발생합니다. 예를 들어 '두 번째로 높은 점수'나 '세 번째로 높은 매출액'을 구하는 상황이 대표적입니다.
MySQL에서는 ORDER BY와 LIMIT 절을 조합하면 이러한 요구 사항을 간단하게 해결할 수 있습니다. 기본 문법은 다음과 같습니다.
SELECT DISTINCT(yourColumnName) FROM yourTableName ORDER BY yourColumnName DESC LIMIT (NthValue-1), 1;
문법 핵심 포인트
- DISTINCT: 중복된 값을 제거하여 동일한 값이 여러 개 있어도 순위가 밀리지 않도록 합니다.
- ORDER BY ... DESC: 내림차순으로 정렬하여 가장 큰 값부터 나열합니다.
- LIMIT (NthValue-1), 1: 첫 번째 인자는 건너뛸 행의 수(offset), 두 번째 인자는 가져올 행의 수입니다. 즉, N번째 값만 정확히 하나 반환합니다.
실습 예제: 테이블 생성 및 데이터 삽입
먼저 실습에 사용할 테이블을 생성해 보겠습니다.
mysql> CREATE TABLE DemoTable1594
-> (
-> Marks INT
-> );
Query OK, 0 rows affected (0.49 sec)다음으로 INSERT 명령어를 사용해 몇 개의 레코드를 삽입합니다.
mysql> INSERT INTO DemoTable1594 VALUES(76); Query OK, 1 row affected (0.15 sec) mysql> INSERT INTO DemoTable1594 VALUES(95); Query OK, 1 row affected (0.16 sec) mysql> INSERT INTO DemoTable1594 VALUES(56); Query OK, 1 row affected (0.13 sec) mysql> INSERT INTO DemoTable1594 VALUES(96); Query OK, 1 row affected (0.16 sec) mysql> INSERT INTO DemoTable1594 VALUES(89); Query OK, 1 row affected (0.19 sec)
저장된 데이터 확인하기
SELECT 문으로 테이블의 전체 레코드를 조회해 보겠습니다.
mysql> SELECT * FROM DemoTable1594;
실행 결과는 다음과 같습니다.
+-------+ | Marks | +-------+ | 76 | | 95 | | 56 | | 96 | | 89 | +-------+ 5 rows in set (0.00 sec)
N번째로 높은 값 조회 쿼리 실행
이제 실제로 세 번째로 높은 값을 조회해 보겠습니다. LIMIT 2, 1은 앞의 2개 행(96, 95)을 건너뛰고 그 다음 행 하나만 가져온다는 의미입니다.
mysql> SELECT DISTINCT(Marks) FROM DemoTable1594 ORDER BY Marks DESC LIMIT 2,1;
실행 결과는 다음과 같습니다.
+-------+ | Marks | +-------+ | 89 | +-------+ 1 row in set (0.00 sec)
내림차순으로 정렬하면 96 → 95 → 89 → 76 → 56 순서가 되므로, 세 번째로 높은 값인 89가 정상적으로 반환된 것을 확인할 수 있습니다.
마무리 및 참고 사항
이 방식은 MySQL 5.x 버전까지 널리 사용되는 방법입니다. MySQL 8.0 이상을 사용한다면 윈도우 함수인 DENSE_RANK()를 활용하는 것도 좋은 대안입니다. 다만 간단한 단일 컬럼 조회라면 위에서 소개한 LIMIT offset, count 방식이 가장 직관적이고 성능 면에서도 효율적입니다.