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

MySQL 결과 집합에서 첫 번째와 마지막 데이터 행을 선택하는 방법

MySQL에서 MIN() 함수와 MAX() 함수를 활용하면 결과 집합의 첫 번째 행과 마지막 행을 손쉽게 조회할 수 있습니다. 기본 문법은 다음과 같습니다.

SELECT *
FROM yourTableName
WHERE yourColumnName = (SELECT MIN(yourColumnName) FROM yourTableName)
UNION
SELECT *
FROM yourTableName
WHERE yourColumnName = (SELECT MAX(yourColumnName) FROM yourTableName);

이 쿼리는 UNION 연산자로 두 개의 SELECT 문을 하나로 결합합니다. 첫 번째 SELECT 문은 서브쿼리로 구한 최솟값(MIN)에 해당하는 행을, 두 번째 SELECT 문은 최댓값(MAX)에 해당하는 행을 각각 반환합니다.

예제 테이블 생성

문법을 실제로 이해하기 위해 예제 테이블을 먼저 만들어 보겠습니다. 테이블 생성 쿼리는 다음과 같습니다.

mysql> create table FirstAndLastDataDemo
-> (
-> EmployeeId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> EmployeeName varchar(20),
-> EmployeeAge int
-> );
Query OK, 0 rows affected (0.59 sec)

데이터 삽입

INSERT 명령어로 직원 정보 레코드를 여러 개 추가합니다.

mysql> insert into FirstAndLastDataDemo(EmployeeName,EmployeeAge) values('John',23);
Query OK, 1 row affected (0.15 sec)
mysql> insert into FirstAndLastDataDemo(EmployeeName,EmployeeAge) values('Bob',13);
Query OK, 1 row affected (0.11 sec)
mysql> insert into FirstAndLastDataDemo(EmployeeName,EmployeeAge) values('Larry',24);
Query OK, 1 row affected (0.14 sec)
mysql> insert into FirstAndLastDataDemo(EmployeeName,EmployeeAge) values('Sam',14);
Query OK, 1 row affected (0.18 sec)
mysql> insert into FirstAndLastDataDemo(EmployeeName,EmployeeAge) values('Mike',31);
Query OK, 1 row affected (0.10 sec)
mysql> insert into FirstAndLastDataDemo(EmployeeName,EmployeeAge) values('James',18);
Query OK, 1 row affected (0.16 sec)
mysql> insert into FirstAndLastDataDemo(EmployeeName,EmployeeAge) values('Maxwell',28);
Query OK, 1 row affected (0.17 sec)
mysql> insert into FirstAndLastDataDemo(EmployeeName,EmployeeAge) values('David',27);
Query OK, 1 row affected (0.12 sec)
mysql> insert into FirstAndLastDataDemo(EmployeeName,EmployeeAge) values('Chris',22);
Query OK, 1 row affected (0.19 sec)

전체 레코드 조회

SELECT 문으로 테이블에 저장된 모든 레코드를 확인합니다.

mysql> select *from FirstAndLastDataDemo;

출력 결과

+------------+--------------+-------------+
| EmployeeId | EmployeeName | EmployeeAge |
+------------+--------------+-------------+
| 1 | John | 23 |
| 2 | Bob | 13 |
| 3 | Larry | 24 |
| 4 | Sam | 14 |
| 5 | Mike | 31 |
| 6 | James | 18 |
| 7 | Maxwell | 28 |
| 8 | David | 27 |
| 9 | Chris | 22 |
+------------+--------------+-------------+
9 rows in set (0.00 sec)

첫 번째 행과 마지막 행 조회 쿼리

다음은 첫 번째 행 데이터와 마지막 행 데이터를 한 번에 가져오는 쿼리입니다.

mysql> SELECT *
-> FROM FirstAndLastDataDemo
-> WHERE EmployeeId = (SELECT MIN(EmployeeId) FROM FirstAndLastDataDemo)
-> UNION
-> SELECT *
-> FROM FirstAndLastDataDemo
-> WHERE EmployeeId = (SELECT MAX(EmployeeId) FROM FirstAndLastDataDemo);

출력 결과

가장 작은 EmployeeId(1번 John)와 가장 큰 EmployeeId(9번 Chris)에 해당하는 두 개의 행만 반환된 것을 확인할 수 있습니다.

+------------+--------------+-------------+
| EmployeeId | EmployeeName | EmployeeAge |
+------------+--------------+-------------+
| 1 | John | 23 |
| 9 | Chris | 22 |
+------------+--------------+-------------+
2 rows in set (0.00 sec)

참고: ORDER BY와 LIMIT을 활용한 대안

AUTO_INCREMENT처럼 순차적으로 증가하는 컬럼이 없는 경우에는 ORDER BY 절과 LIMIT을 조합하는 방법도 유용합니다.

-- 첫 번째 행 조회
SELECT * FROM yourTableName ORDER BY yourColumnName ASC LIMIT 1;

-- 마지막 행 조회
SELECT * FROM yourTableName ORDER BY yourColumnName DESC LIMIT 1;

두 방식 모두 널리 사용되며, 데이터 특성과 인덱스 구성에 따라 성능 차이가 있을 수 있으므로 상황에 맞는 방법을 선택하시면 됩니다.