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

MySQL에서 마지막 행을 제외한 테이블의 전체 행 조회 방법 완벽 가이드

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 INORDER BY ... LIMIT 1을 조합할 수도 있습니다.

select *from AllRecordsExceptLastOne where Id NOT IN (select Id from AllRecordsExceptLastOne order by Id desc limit 1);

두 방식 모두 AUTO_INCREMENT 기본키처럼 순차적으로 증가하는 컬럼이 있을 때 잘 동작합니다. 다만 정렬 기준이 되는 컬럼이 없는 테이블이라면 '마지막 행'의 의미 자체가 불분명해질 수 있으므로, 반드시 ID나 등록 시간 같은 정렬 가능한 컬럼을 기준으로 사용하는 것이 좋습니다.