개요
MySQL에서 VARCHAR 타입으로 저장된 필드의 최대값을 구하려면 MAX() 함수와 SUBSTRING() 함수를 함께 사용해야 합니다. VARCHAR 필드는 문자열 기준으로 비교되기 때문에, 값이 숫자처럼 보여도 단순히 MAX()만 적용하면 의도한 결과가 나오지 않을 수 있습니다.
먼저 예제에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable
-> (
-> Id varchar(200)
-> );
Query OK, 0 rows affected (0.52 sec)
1단계: 테이블에 데이터 삽입
INSERT 명령을 사용하여 테이블에 샘플 레코드를 추가합니다.
mysql> insert into DemoTable values('2019-0515-1980');
Query OK, 1 row affected (0.49 sec)
mysql> insert into DemoTable values('2019-0516-780');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values('2019-0517-2780');
Query OK, 1 row affected (0.16 sec)2단계: 저장된 레코드 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from DemoTable;
출력 결과
+----------------+
| Id |
+----------------+
| 2019-0515-1980 |
| 2019-0516-780 |
| 2019-0517-2780 |
+----------------+
3 rows in set (0.00 sec)
3단계: VARCHAR 필드에서 최대값 구하는 쿼리 실행
다음은 VARCHAR 필드에서 최대값을 구하는 쿼리입니다.
mysql> select max(Id) from DemoTable
-> where Id LIKE CONCAT(SUBSTRING(Id, 1, 4),'%');
출력 결과
+----------------+
| max(Id) |
+----------------+
| 2019-0517-2780 |
+----------------+
1 row in set (0.00 sec)
쿼리 동작 원리
위 쿼리는 다음과 같은 단계로 동작합니다.
- SUBSTRING(Id, 1, 4): 각 행의 Id 값에서 앞 4자리(예: '2019')를 추출합니다.
- CONCAT(..., '%'): 추출한 접두사에 와일드카드 '%'를 붙여 LIKE 조건을 생성합니다.
- WHERE 절: 동일한 접두사를 가진 레코드만 대상으로 조회 범위를 좁힙니다.
- MAX(Id): 조건에 맞는 레코드 중 문자열 비교 기준으로 가장 큰 값을 반환합니다.
이 예제에서는 '2019'로 시작하는 세 개의 값 중 문자열 비교상 가장 큰 '2019-0517-2780'이 최대값으로 반환됩니다. 참고로, 하이픈 뒤의 숫자 부분을 실제 숫자 기준으로 비교하고 싶다면 CAST()나 SUBSTRING_INDEX() 등을 활용해 숫자 부분만 분리한 후 정렬하는 방법도 함께 고려해 볼 수 있습니다.