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

MySQL에서 내림차순 정렬 시 첫 번째 행을 제외한 나머지 행만 조회하는 쿼리

MySQL에서 데이터를 내림차순으로 정렬한 후 첫 번째 행, 즉 최댓값에 해당하는 행을 제외한 나머지 행만 조회하고 싶다면 NOT IN 연산자와 서브쿼리를 활용하면 간단하게 해결할 수 있습니다. 아래 예제를 통해 단계별로 살펴보겠습니다.

1. 테이블 생성

먼저 데모용 테이블을 생성합니다.

mysql> create table DemoTable
    -> (
    -> Amount int
    -> );
Query OK, 0 rows affected (0.50 sec)

2. 데이터 삽입

insert 명령을 사용하여 테이블에 샘플 데이터를 입력합니다.

mysql> insert into DemoTable values(10);
Query OK, 1 row affected (0.17 sec)

mysql> insert into DemoTable values(20);
Query OK, 1 row affected (0.11 sec)

mysql> insert into DemoTable values(30);
Query OK, 1 row affected (0.10 sec)

mysql> insert into DemoTable values(40);
Query OK, 1 row affected (0.15 sec)

3. 전체 데이터 확인

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

mysql> select *from DemoTable;

출력 결과

+--------+
| Amount |
+--------+
|     10 |
|     20 |
|     30 |
|     40 |
+--------+
4 rows in set (0.00 sec)

4. 내림차순 정렬 시 첫 번째 행을 제외한 행 조회하기

내림차순 기준 첫 번째 행은 Amount 컬럼의 최댓값입니다. 따라서 서브쿼리로 최댓값을 구한 뒤, 해당 값을 가진 행을 제외하고 나머지 행을 내림차순으로 정렬하면 원하는 결과를 얻을 수 있습니다.

mysql> select *from DemoTable WHERE Amount NOT IN (SELECT MAX(Amount) from DemoTable) ORDER BY Amount DESC;

출력 결과

+--------+
| Amount |
+--------+
|     30 |
|     20 |
|     10 |
+--------+
3 rows in set (0.05 sec)

쿼리 동작 원리

  • SELECT MAX(Amount) FROM DemoTable : 테이블에서 가장 큰 값인 40을 반환합니다.
  • WHERE Amount NOT IN (...) : 최댓값 40과 일치하는 행을 결과에서 제외합니다.
  • ORDER BY Amount DESC : 남은 행들을 큰 값부터 작은 값 순으로 정렬합니다.

참고: LIMIT과 OFFSET을 활용한 대안

행의 개수와 상관없이 첫 번째 행만 건너뛰고 싶다면 LIMITOFFSET을 조합하는 방법도 있습니다.

mysql> SELECT * FROM DemoTable ORDER BY Amount DESC LIMIT 1, 18446744073709551615;

LIMIT 1, N은 첫 번째 행 1개를 건너뛴(offset) 후 그다음부터 N개의 행을 가져온다는 의미입니다. MySQL에서 허용되는 최대 행 수를 N으로 지정하면 두 번째 행부터 끝까지 모두 조회할 수 있습니다. 다만 이 방식은 가독성이 떨어지므로, 특정 값(최댓값)을 기준으로 제외하는 NOT IN 방식이 더 직관적이고 안전한 선택이 될 수 있습니다.