MySQL에서 VARCHAR 컬럼의 숫자값으로 최댓값 구하기
MySQL에서 숫자 데이터가 VARCHAR(문자열) 타입으로 저장되어 있으면, 단순히 ORDER BY 절만 사용할 경우 값이 사전순(문자열 기준)으로 정렬되어 의도한 결과를 얻을 수 없습니다. 예를 들어 '1089.00'보다 '788.00'이 더 크다고 잘못 판단될 수 있습니다.
이 문제를 해결하려면 CAST() 함수를 사용해 varchar 값을 정수(SIGNED INTEGER)로 형 변환한 뒤 정렬해야 합니다. 아래에서 전체 과정을 단계별로 살펴보겠습니다.
1. 테이블 생성
먼저 ItemPrice 컬럼을 varchar 타입으로 갖는 테이블을 생성합니다.
mysql> create table DemoTable765 (ItemPrice varchar(200));
Query OK, 0 rows affected (0.52 sec)
2. 샘플 데이터 삽입
INSERT 명령어를 사용하여 테이블에 레코드를 추가합니다.
mysql> insert into DemoTable765 values('567.00');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable765 values('1089.00');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable765 values('540.00');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable765 values('788.00');
Query OK, 1 row affected (0.39 sec)3. 저장된 전체 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable765;
실행 결과는 다음과 같습니다.
+-----------+
| ItemPrice |
+-----------+
| 567.00 |
| 1089.00 |
| 540.00 |
| 788.00 |
+-----------+
4 rows in set (0.00 sec)
4. CAST()를 활용한 최댓값 조회
아래 쿼리는 CAST() 함수로 ItemPrice 컬럼을 SIGNED INTEGER로 변환한 후 내림차순(DESC) 정렬하여, 가장 큰 값이 맨 위에 표시되도록 합니다.
mysql> select *from DemoTable765 order by cast(ItemPrice AS SIGNED INTEGER) DESC;
실행 결과는 다음과 같습니다.
+-----------+
| ItemPrice |
+-----------+
| 1089.00 |
| 788.00 |
| 567.00 |
| 540.00 |
+-----------+
4 rows in set, 4 warnings (0.00 sec)
'1089.00'이 가장 큰 값으로 정상적으로 맨 위에 표시되는 것을 확인할 수 있습니다.
추가 팁
소수점 유지: 소수점 이하 자릿수까지 비교해야 한다면 SIGNED INTEGER 대신 DECIMAL 타입으로 변환하는 것이 좋습니다. 정수로 변환하면 소수 부분이 잘려 경고(warnings)가 발생할 수 있습니다.
mysql> select *from DemoTable765 order by cast(ItemPrice AS DECIMAL(10,2)) DESC;
최댓값 하나만 가져오기: 집계 함수 MAX()와 함께 사용하면 가장 큰 값 한 건만 바로 조회할 수도 있습니다.
mysql> select max(cast(ItemPrice AS SIGNED)) as HighestPrice from DemoTable765;