MySQL에서 테이블의 마지막 행만 제외하고 나머지 모든 행을 조회하려면 != 연산자와 서브쿼리를 함께 사용하면 됩니다. 핵심 아이디어는 서브쿼리로 기준 컬럼의 최댓값(즉, 마지막 행의 ID)을 구한 뒤, 그 값과 일치하지 않는 행만 가져오는 것입니다.
기본 문법
select *from yourTableName where yourIdColumnName != (select max(yourIdColumnName) from yourTableName);
예제 테이블 생성
문법을 이해하기 위해 실제 예제 테이블을 만들어 보겠습니다. 아래 쿼리로 테이블을 생성합니다.
mysql> create table AllRecordsExceptLastOne
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> UserName varchar(10),
-> UserAge int,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.65 sec)샘플 데이터 삽입
INSERT 명령으로 몇 개의 레코드를 추가합니다.
mysql> insert into AllRecordsExceptLastOne(UserName,UserAge) values('John',21);
Query OK, 1 row affected (0.12 sec)
mysql> insert into AllRecordsExceptLastOne(UserName,UserAge) values('Carol',28);
Query OK, 1 row affected (0.18 sec)
mysql> insert into AllRecordsExceptLastOne(UserName,UserAge) values('Mike',22);
Query OK, 1 row affected (0.13 sec)
mysql> insert into AllRecordsExceptLastOne(UserName,UserAge) values('Sam',29);
Query OK, 1 row affected (0.14 sec)
mysql> insert into AllRecordsExceptLastOne(UserName,UserAge) values('David',27);
Query OK, 1 row affected (0.11 sec)
mysql> insert into AllRecordsExceptLastOne(UserName,UserAge) values('Larry',24);
Query OK, 1 row affected (0.20 sec)전체 레코드 확인
SELECT 문으로 테이블에 저장된 모든 레코드를 먼저 확인해 보겠습니다.
mysql> select *from AllRecordsExceptLastOne;
실행 결과는 다음과 같습니다.
+----+----------+---------+ | Id | UserName | UserAge | +----+----------+---------+ | 1 | John | 21 | | 2 | Carol | 28 | | 3 | Mike | 22 | | 4 | Sam | 29 | | 5 | David | 27 | | 6 | Larry | 24 | +----+----------+---------+ 6 rows in set (0.00 sec)
마지막 행을 제외한 조회 쿼리
이제 마지막 행(Id가 6인 Larry)을 제외한 나머지 행을 조회하는 쿼리입니다. 서브쿼리의 max(Id)가 마지막 행의 ID를 반환하고, != 조건으로 해당 행을 걸러냅니다.
mysql> select *from AllRecordsExceptLastOne where Id!=(select max(Id) from AllRecordsExceptLastOne);
실행 결과는 다음과 같습니다.
+----+----------+---------+ | Id | UserName | UserAge | +----+----------+---------+ | 1 | John | 21 | | 2 | Carol | 28 | | 3 | Mike | 22 | | 4 | Sam | 29 | | 5 | David | 27 | +----+----------+---------+ 5 rows in set (0.04 sec)
참고: NOT IN을 활용한 대체 방법
동일한 결과를 얻는 또 다른 방법으로, NOT IN과 ORDER BY ... LIMIT 1을 조합할 수도 있습니다.
select *from AllRecordsExceptLastOne where Id NOT IN (select Id from AllRecordsExceptLastOne order by Id desc limit 1);
두 방식 모두 AUTO_INCREMENT 기본키처럼 순차적으로 증가하는 컬럼이 있을 때 잘 동작합니다. 다만 정렬 기준이 되는 컬럼이 없는 테이블이라면 '마지막 행'의 의미 자체가 불분명해질 수 있으므로, 반드시 ID나 등록 시간 같은 정렬 가능한 컬럼을 기준으로 사용하는 것이 좋습니다.