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

MySQL에서 첫 번째와 마지막 행을 제외한 나머지 행 조회하기

개요

MySQL에서 테이블의 첫 번째 행과 마지막 행을 제외한 나머지 모든 행을 조회하려면 서브쿼리와 함께 MIN(), MAX() 함수를 사용하면 됩니다. 이 글에서는 예제 테이블을 직접 만들어 보면서 단계별로 쿼리를 작성하는 방법을 살펴보겠습니다.

1. 예제 테이블 생성

먼저 아래와 같이 학생 정보를 저장할 테이블을 생성합니다.

mysql> create table DemoTable1917
    (
    StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    StudentCode int,
    StudentMarks int
    );
Query OK, 0 rows affected (0.00 sec)

2. 데이터 삽입

INSERT 명령을 사용하여 테이블에 여러 개의 레코드를 추가합니다.

mysql> insert into DemoTable1917(StudentCode,StudentMarks) values(78,95);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1917(StudentCode,StudentMarks) values(78,96);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1917(StudentCode,StudentMarks) values(78,97);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1917(StudentCode,StudentMarks) values(78,98);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1917(StudentCode,StudentMarks) values(78,99);
Query OK, 1 row affected (0.00 sec)

3. 전체 데이터 확인

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

mysql> select * from DemoTable1917;

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

+-----------+-------------+--------------+
| StudentId | StudentCode | StudentMarks |
+-----------+-------------+--------------+
|         1 |          78 |           95 |
|         2 |          78 |           96 |
|         3 |          78 |           97 |
|         4 |          78 |           98 |
|         5 |          78 |           99 |
+-----------+-------------+--------------+
5 rows in set (0.00 sec)

4. 첫 번째와 마지막 행을 제외한 행 조회하기

다음은 첫 번째 행과 마지막 행을 제외한 나머지 행만 가져오는 쿼리입니다. 핵심 원리는 NOT IN 조건 안에 서브쿼리로 MIN(StudentId)(가장 작은 ID)와 MAX(StudentId)(가장 큰 ID)를 넘겨서, 해당 ID를 가진 두 행을 결과에서 제외하는 것입니다.

mysql> select * from DemoTable1917
    where StudentId NOT IN
    (
    (
    select min(StudentId) from DemoTable1917 where StudentCode=78),
    (select max(StudentId) from DemoTable1917 where StudentCode=78)
    ) and StudentCode=78;

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

+-----------+-------------+--------------+
| StudentId | StudentCode | StudentMarks |
+-----------+-------------+--------------+
|         2 |          78 |           96 |
|         3 |          78 |           97 |
|         4 |          78 |           98 |
+-----------+-------------+--------------+
3 rows in set (0.00 sec)

정리

이처럼 MIN()MAX()를 서브쿼리로 활용하면 특정 조건(StudentCode=78)에 해당하는 행들 중 자동 증가 ID 기준으로 첫 번째 행과 마지막 행을 손쉽게 제외할 수 있습니다. 데이터가 많아져도 동일한 패턴을 그대로 적용할 수 있으므로, 경계값(boundary row)을 제거한 중간 데이터만 추출해야 하는 상황에서 유용하게 사용할 수 있습니다.