MySQL에서 LIMIT 절 없이 두 번째로 큰 레코드 선택하기
네, 가능합니다. MySQL에서는 LIMIT 절을 사용하지 않고도 서브쿼리와 MAX() 함수를 조합하여 테이블에서 두 번째로 큰 값을 손쉽게 조회할 수 있습니다. 이번 글에서는 실제 예제를 통해 그 방법을 단계별로 살펴보겠습니다.
1. 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
(
Number int
);
Query OK, 0 rows affected (0.66 sec)
위 쿼리는 정수형 데이터를 저장할 Number 컬럼 하나를 가진 DemoTable이라는 테이블을 만듭니다.
2. 샘플 데이터 삽입
INSERT 명령어를 사용해 테이블에 여러 개의 숫자를 입력합니다.
mysql> insert into DemoTable values(78);
mysql> insert into DemoTable values(67);
mysql> insert into DemoTable values(92);
mysql> insert into DemoTable values(98);
mysql> insert into DemoTable values(88);
mysql> insert into DemoTable values(86);
mysql> insert into DemoTable values(89);
3. 전체 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+--------+
| Number |
+--------+
| 78 |
| 67 |
| 92 |
| 98 |
| 88 |
| 86 |
| 89 |
+--------+
7 rows in set (0.00 sec)
데이터를 보면 가장 큰 값은 98, 두 번째로 큰 값은 92임을 알 수 있습니다.
4. LIMIT 없이 두 번째로 큰 값 구하기
핵심 아이디어는 간단합니다. 전체 테이블의 최댓값보다 작은 값들 중에서 다시 최댓값을 구하면, 그것이 곧 두 번째로 큰 값이 됩니다. 이를 서브쿼리로 표현하면 다음과 같습니다.
mysql> SELECT MAX(Number)
FROM DemoTable
WHERE Number < (SELECT MAX(Number) FROM DemoTable);
실행 결과:
+-------------+
| MAX(Number) |
+-------------+
| 92 |
+-------------+
1 row in set (0.00 sec)
동작 원리 설명
이 쿼리는 두 단계로 동작합니다.
첫 번째 단계: 내부 서브쿼리 (SELECT MAX(Number) FROM DemoTable)가 테이블 전체의 최댓값인 98을 반환합니다.
두 번째 단계: 외부 쿼리는 98보다 작은 값(78, 67, 92, 88, 86, 89) 중에서 최댓값, 즉 92를 결과로 반환합니다.
참고: N번째로 큰 값으로 확장하기
이 방식은 응용도 가능합니다. 예를 들어 세 번째로 큰 값을 구하려면 WHERE 조건을 다음과 같이 중첩하면 됩니다.
SELECT MAX(Number)
FROM DemoTable
WHERE Number < (
SELECT MAX(Number) FROM DemoTable
WHERE Number < (SELECT MAX(Number) FROM DemoTable)
);
다만 N번째 값까지 구할 때는 서브쿼리가 깊어지므로, 실무에서는 LIMIT ... OFFSET 방식이나 윈도우 함수(DENSE_RANK 등)를 사용하는 것이 더 효율적일 수 있습니다.