개요
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)을 제거한 중간 데이터만 추출해야 하는 상황에서 유용하게 사용할 수 있습니다.