MySQL에서 DECIMAL 타입으로 저장된 값들 중 정수가 아닌, 즉 소수점 이하 자릿수를 가진 숫자만 골라내고 싶을 때가 있습니다. 이럴 때는 FLOOR() 함수를 활용하면 간단하게 해결할 수 있습니다. FLOOR 함수는 인자로 받은 값을 내림하여 가장 큰 정수를 반환하므로, 원래 값과 FLOOR 값이 다르다면 그 값은 소수를 포함한 숫자라고 판단할 수 있습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable628 (Value DECIMAL(10,2)); Query OK, 0 rows affected (0.52 sec)
DECIMAL(10,2)로 선언하면 총 10자리 숫자 중 소수점 둘째 자리까지 저장할 수 있습니다.
2. 샘플 데이터 삽입하기
INSERT 문을 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable628 values(10.97); Query OK, 1 row affected (0.13 sec) mysql> insert into DemoTable628 values(20.04); Query OK, 1 row affected (0.18 sec) mysql> insert into DemoTable628 values(12.00); Query OK, 1 row affected (0.17 sec) mysql> insert into DemoTable628 values(89.56); Query OK, 1 row affected (0.20 sec)
3. 전체 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable628;
실행 결과는 다음과 같습니다.
+-------+ | Value | +-------+ | 10.97 | | 20.04 | | 12.00 | | 89.56 | +-------+ 4 rows in set (0.00 sec)
4. 소수점 숫자만 조회하는 쿼리
이제 열 값 목록에서 부동 소수점 숫자(소수부를 가진 값)만 가져오는 쿼리입니다. 핵심은 Value != FLOOR(Value) 조건입니다.
mysql> select *from DemoTable628
where Value != FLOOR(Value);실행 결과는 다음과 같습니다.
+-------+ | Value | +-------+ | 10.97 | | 20.04 | | 89.56 | +-------+ 3 rows in set (0.00 sec)
결과 분석
출력 결과를 보면 12.00은 제외되었습니다. 12.00은 소수점 이하가 0이므로 사실상 정수와 같은 값이기 때문입니다. 반면 10.97, 20.04, 89.56은 소수부를 가지고 있어 모두 조회되었습니다.
참고: CEILING() 또는 TRUNCATE() 활용
FLOOR 대신 CEILING()(올림) 함수나 TRUNCATE(Value, 0)(소수점 버림)를 사용해도 동일한 결과를 얻을 수 있습니다. 예를 들어 where Value != TRUNCATE(Value, 0) 조건도 같은 방식으로 동작합니다. 또한 MySQL 8.0 이상에서는 MOD(Value, 1) != 0 조건으로도 소수 여부를 판별할 수 있으니 상황에 맞게 활용해 보시기 바랍니다.