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을 활용한 대안
행의 개수와 상관없이 첫 번째 행만 건너뛰고 싶다면 LIMIT와 OFFSET을 조합하는 방법도 있습니다.
mysql> SELECT * FROM DemoTable ORDER BY Amount DESC LIMIT 1, 18446744073709551615;
LIMIT 1, N은 첫 번째 행 1개를 건너뛴(offset) 후 그다음부터 N개의 행을 가져온다는 의미입니다. MySQL에서 허용되는 최대 행 수를 N으로 지정하면 두 번째 행부터 끝까지 모두 조회할 수 있습니다. 다만 이 방식은 가독성이 떨어지므로, 특정 값(최댓값)을 기준으로 제외하는 NOT IN 방식이 더 직관적이고 안전한 선택이 될 수 있습니다.