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

MySQL LIMIT OFFSET을 활용해 열에서 n번째로 높은 값 조회하기

MySQL에서 특정 열(column)의 n번째로 높은 값을 구하고 싶다면 LIMITOFFSET을 함께 사용하면 됩니다. 핵심 아이디어는 간단합니다. 값을 내림차순으로 정렬한 뒤, OFFSET으로 앞의 값들을 건너뛰고 원하는 순번의 값 하나만 가져오는 것입니다.

1. 테이블 생성하기

먼저 예제에 사용할 테이블을 만들어 보겠습니다.

mysql> create table DemoTable
(
    Value int
);
Query OK, 0 rows affected (0.49 sec)

2. 샘플 데이터 삽입하기

INSERT 명령어를 사용해 여러 개의 레코드를 추가합니다.

mysql> insert into DemoTable values(100);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values(140);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values(90);
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable values(80);
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable values(89);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values(98);
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable values(58);
Query OK, 1 row affected (0.10 sec)

3. 전체 데이터 확인하기

SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.

mysql> select *from DemoTable;

실행 결과는 다음과 같습니다.

+-------+
| Value |
+-------+
|   100 |
|   140 |
|    90 |
|    80 |
|    89 |
|    98 |
|    58 |
+-------+
7 rows in set (0.00 sec)

4. n번째로 높은 값 조회 쿼리

이제 본론입니다. 아래 쿼리는 ORDER BY로 값을 정렬한 후 OFFSET 3을 사용해 상위 3개의 값을 건너뛰고, 그 다음 값 1개만 가져옵니다. 즉, 4번째로 높은 값을 구하는 쿼리입니다.

mysql> select Value from DemoTable
    order by Value limit 1 offset 3;

실행 결과는 다음과 같습니다.

+-------+
| Value |
+-------+
|    90 |
+-------+
1 row in set (0.00 sec)

동작 원리 정리

이 방식의 원리를 공식처럼 정리하면 다음과 같습니다.

  • ORDER BY Value DESC: 값을 큰 순서대로 정렬합니다.
  • LIMIT 1: 최종적으로 한 개의 행만 반환합니다.
  • OFFSET N: 정렬된 결과에서 앞의 N개 행을 건너뜁니다.

따라서 OFFSET (n-1)을 지정하면 n번째로 높은 값을 얻을 수 있습니다. 예를 들어 두 번째로 높은 값이 필요하면 OFFSET 1, 세 번째라면 OFFSET 2를 사용하면 됩니다.

참고: 중복 값 처리 주의사항

이 방법은 중복된 값도 하나의 순위로 계산한다는 점에 유의해야 합니다. 예를 들어 데이터에 140이 두 번 있다면, 두 번째로 높은 '고유한 값'을 구하고 싶을 때는 DISTINCT를 함께 사용하는 것이 좋습니다.

select DISTINCT Value from DemoTable
    order by Value desc limit 1 offset 1;

이처럼 LIMIT ... OFFSET ... 조합은 서브쿼리 없이도 간단하게 n번째 최댓값을 구할 수 있는 실용적인 방법입니다.