MySQL에서 문자열+정수 혼합 데이터의 최대값 구하는 방법
"STU201"처럼 문자와 숫자가 함께 들어 있는 컬럼에서 최대값을 구하려면 CAST() 함수를 MAX() 함수와 함께 사용해야 합니다. 문자열 자체로는 올바른 숫자 비교가 불가능하기 때문에, 숫자 부분만 추출한 뒤 정수형으로 변환하는 과정이 필요합니다.
이때 SUBSTRING()으로 숫자 부분만 잘라내고, CAST()로 UNSIGNED(부호 없는 정수) 타입으로 변환한 후 MAX()를 적용하면 됩니다.
1. 테이블 생성
먼저 예제에 사용할 테이블을 만들어 보겠습니다.
mysql> create table DemoTable
(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentBookCode varchar(200)
);
Query OK, 0 rows affected (0.56 sec)2. 샘플 데이터 입력
INSERT 명령을 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable(StudentBookCode) values('STU201');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable(StudentBookCode) values('STU202');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable(StudentBookCode) values('STU203');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable(StudentBookCode) values('STU290');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable(StudentBookCode) values('STU234');
Query OK, 1 row affected (0.15 sec)3. 전체 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+----+-----------------+ | Id | StudentBookCode | +----+-----------------+ | 1 | STU201 | | 2 | STU202 | | 3 | STU203 | | 4 | STU290 | | 5 | STU234 | +----+-----------------+ 5 rows in set (0.00 sec)
4. 최대값 조회 쿼리
이제 문자열에서 숫자 부분만 추출해 최대값을 구하는 쿼리를 실행합니다. "STU"는 앞 3글자이므로 SUBSTRING()으로 4번째 문자부터 잘라내면 숫자만 남게 됩니다.
mysql> select MAX(CAST(SUBSTRING(StudentBookCode FROM 4) AS UNSIGNED)) from DemoTable;
실행 결과는 다음과 같습니다.
+----------------------------------------------------------+ | MAX(CAST(SUBSTRING(StudentBookCode FROM 4) AS UNSIGNED)) | +----------------------------------------------------------+ | 290 | +----------------------------------------------------------+ 1 row in set (0.00 sec)
핵심 포인트 정리
- SUBSTRING(컬럼명 FROM 시작위치): 지정한 위치부터 문자열을 잘라냅니다. 위 예제에서는 'STU' 뒤의 숫자만 추출하기 위해 4번째 위치부터 지정했습니다.
- CAST(... AS UNSIGNED): 추출된 문자열을 부호 없는 정수로 변환하여 숫자 비교가 가능하게 합니다.
- MAX(): 변환된 숫자 값 중 가장 큰 값을 반환합니다.
이처럼 CAST()와 SUBSTRING()을 조합하면 문자열과 정수가 섞여 있는 데이터에서도 정확하게 최대값을 구할 수 있습니다. 참고로 MySQL 8.0 이상에서는 REGEXP_REPLACE()나 SPLIT_PART와 유사한 문자열 함수를 활용해 더 유연하게 숫자를 추출할 수도 있습니다.