MySQL에는 사칙 연산이나 삼각 함수 외에도 특수한 수학 연산에 사용되는 내장 함수들이 존재한다. 이들은 데이터 분석, 무작위 처리, 방향 판단, 정규화 등에 자주 사용된다. 이번 글에서는 실무에서 유용하게 쓰이는 PI(), RAND(), SIGN(), LEAST(), GREATEST(), ROUND()의 특수 사용법 등을 예제 중심으로 정리한다.

PI() 함수 – 원주율 상수
PI() 함수는 수학 상수 π(파이) 값을 반환한다. 이는 원의 둘레, 면적, 각도 계산 등에서 필수적으로 사용된다.
SELECT PI(); -- 결과: 3.141592653589793
예제: 원의 면적 계산
SELECT radius, PI() * POW(radius, 2) AS area
FROM circles;
반지름이 주어졌을 때 원의 넓이를 계산하는 수식에 활용된다.
RAND() 함수 – 무작위 난수 생성
RAND() 함수는 0 이상 1 미만의 **난수(random float)**를 반환한다. 시드 값을 지정하면 예측 가능한 값이 나온다.
SELECT RAND(); -- 예: 0.31845...
SELECT RAND(100); -- 같은 시드 → 같은 결과
예제: 1부터 100 사이 난수 생성
SELECT FLOOR(RAND() * 100) + 1 AS random_number;
이렇게 하면 1~100 사이의 정수를 생성할 수 있다. 랜덤 추천, 테스트 데이터 생성, 샘플링 등에 매우 유용하다.
SIGN() 함수 – 부호 반환
SIGN(number) 함수는 입력 값이 양수면 1, 음수면 -1, 0이면 0을 반환한다.
SELECT SIGN(10); -- 결과: 1
SELECT SIGN(-5.5); -- 결과: -1
SELECT SIGN(0); -- 결과: 0
예제: 수익/손실 방향 표시
SELECT profit, SIGN(profit) AS direction
FROM sales_data;
데이터의 증가/감소 방향을 빠르게 판단할 수 있어, 차트 색상 처리나 시각화 조건 분기에 자주 쓰인다.
LEAST(), GREATEST() 함수 – 다수 값 중 최소/최대 구하기
이 함수들은 여러 인자 중 가장 작은 값(LEAST) 또는 **가장 큰 값(GREATEST)**을 반환한다.
SELECT LEAST(10, 25, 7); -- 결과: 7
SELECT GREATEST(10, 25, 7); -- 결과: 25
예제: 상품 가격 범위 필터링
SELECT product_id,
LEAST(price, max_limit) AS capped_price
FROM products;
가격 상한선을 제한하거나, 최소/최대 비교로 조건을 제한할 때 매우 유용하다.
실무 응용 예제: 데이터 정규화
SELECT value,
ROUND(value / GREATEST(max_val, 1), 2) AS normalized_value
FROM raw_data;
GREATEST()를 이용해 0 나누기 오류를 방지하면서 정규화를 수행할 수 있다. 데이터 정제, AI 전처리, 지표 표준화에 자주 사용된다.
기타 유용 함수
- ROUND(x): 소수점 반올림 (이미 앞에서 다뤘지만, 정수 자리 반올림용으로도 쓰임)
- CEIL(), FLOOR(): 올림, 내림 처리
- TRUNCATE(x, d): 특정 소수점 이하 절사
- POWER(x, y) 또는 POW(x, y): x의 y제곱
이러한 함수들과 함께 쓰이면 계산 로직을 완성도 높게 설계할 수 있다.
정리
- PI()는 원주율로, 면적·각도·좌표계 처리에 기본 상수로 활용된다.
- RAND()는 무작위 숫자를 생성하며, 테스트 데이터나 추천 기능에 자주 쓰인다.
- SIGN()은 숫자의 부호를 판단하여 방향성 분석, 시각화 로직에 유용하다.
- LEAST()와 GREATEST()는 다수의 값 중 최소/최대 비교에 최적화되어 있다.
- 이 특수 함수들은 복잡한 연산을 간단하게 구현할 수 있는 실무형 도구 모음이다.
참고 문서
https://dev.mysql.com/doc/refman/8.0/en/mathematical-functions.html
'DB' 카테고리의 다른 글
| [MySQL] CASE WHEN으로 다중 조건 처리하기 (1) | 2025.07.25 |
|---|---|
| [MySQL] NULLIF로 두 값 비교 후 조건 처리하기 (3) | 2025.07.25 |
| [MySQL] IFNULL로 NULL 값을 기본값으로 대체하기 (0) | 2025.07.25 |
| [MySQL] IF 함수로 조건 분기 처리하는 법 (0) | 2025.07.25 |
| [MySQL] RADIANS, DEGREES로 각도 변환하기 (0) | 2025.07.24 |
| [MySQL] ASIN, ACOS, ATAN 역삼각함수 활용법 (2) | 2025.07.24 |
| [MySQL] SIN, COS, TAN 삼각함수 완전 정리 📐 (1) | 2025.07.24 |
| [MySQL] SQRT, EXP, LOG로 제곱근과 로그 구하기 (0) | 2025.07.24 |