SQL은 그냥 텍스트랑 테이블만 다루는 게 아니야. 실제 데이터베이스에서는 가격, 수량, 점수, 퍼센트, 좌표 같은 숫자를 자주 다뤄야 해. 예를 들어서:
- 할인 계산할 때 금액을 정수로 반올림하고 싶을 때.
- 짝수/홀수 학생 데이터를 뽑고 싶을 때.
- 점수 분석하면서 분산의 제곱근이 궁금할 때.
- 아니면 점수 계산 공식 만들 때 제곱 연산이 필요할 때.
SQL만으로도 외부 프로그래밍 언어 도움 없이 이런 거 다 할 수 있어. 쿼리 안에서 내장 수학 함수로 바로 처리 가능! 오늘은 그중에서 제일 많이 쓰는 여섯 가지를 볼 거야:
ROUND()— 반올림CEIL()— 올림FLOOR()— 내림MOD()— 나머지POWER()— 제곱SQRT()— 제곱근
* 숫자 반올림: ROUND(), CEIL(), FLOOR()*
소수점 있는 숫자(예: 4.67891)를 다룰 때 결과를 반올림해야 할 때가 많아. 예를 들어 평균 점수, 주문 총액, 할인 퍼센트 등등 계산할 때 소수점이 너무 길면 보기 안 좋고 헷갈릴 수도 있지.
ROUND() — 수학적으로 반올림
ROUND(number [, digits])
number— 반올림할 숫자.digits(옵션) — 소수점 아래 몇 자리까지 남길지.
예시:
SELECT ROUND(4.67); -- 5
SELECT ROUND(4.6789, 2); -- 4.68
ROUND()는 우리가 아는 수학 반올림이랑 똑같이 동작해: 4.5 → 5, 4.49 → 4.
돈이나 점수처럼 예쁘게 보여줘야 할 때 완전 유용해: 4.33333 → 4.33.
CEIL() — 올림해서 가장 가까운 정수로
SELECT CEIL(4.1); -- 5
- 이미 정수면 결과는 그대로야.
- 항상 원래 숫자보다 크거나 같은 정수를 반환해.
예를 들어 상품 21개를 10개씩 페이지에 보여주고 싶으면 몇 페이지가 필요한지 계산할 때 좋아: 21 / 10 → 3페이지 필요.
FLOOR() — 내림
SELECT FLOOR(4.9); -- 4
- 원래 숫자보다 작거나 같은 정수를 반환해.
값이 어느 "층"이나 "단계"에 있는지 구할 때 자주 써.
비교:
| 값 | ROUND() | CEIL() | FLOOR() |
|---|---|---|---|
| 4.4 | 4 | 5 | 4 |
| 4.6 | 5 | 5 | 4 |
| -4.6 | -5 | -4 | -5 |
* 나머지: MOD()*
나머지가 왜 필요할까? 예를 들면:
- 숫자가 짝수인지 확인할 때.
- 행을 패턴대로 그룹으로 나눌 때 (예: 3개 팀으로 분배).
- 반복되는 루프 만들 때 (예: "다섯 번째마다").
문법:
MOD(dividend, divisor)
예시:
SELECT MOD(17, 5); -- 2 (3*5 +2)
SELECT MOD(10, 3); -- 1 (3*3 +1)
참고: 나머지의 부호는 첫 번째 인자(dividend)의 부호를 따라가.
활용 예시:
SELECT student_id,
CASE WHEN MOD(student_id, 2) = 0 THEN '짝수' ELSE '홀수' END AS parity
FROM students;
* 제곱: POWER()*
가끔은 그냥 곱셈이 아니라 수학 공식을 써야 할 때가 있어:
- 이자 계산:
base * POWER(1 + rate, years) - 원 넓이:
π * r^2 - 머신러닝에서 공식 가중치 계산
문법:
POWER(base, exponent)
예시:
SELECT POWER(2, 3); -- 8
SELECT POWER(5, 2); -- 25
SELECT POWER(9, 0.5); -- 3 (제곱근)
정수, 소수, 음수 다 쓸 수 있어.
제곱근: SQRT()
특히 통계에서 (예: 표준편차) 제곱근이 필요할 때 SQRT()가 딱이야.
SELECT SQRT(25); -- 5
SELECT SQRT(2); -- ~1.4142
음수를 넣으면 에러가 나. 그럴 가능성이 있으면 ABS()를 같이 써:
SELECT SQRT(ABS(-25)); -- 5
실전 시나리오
시나리오 1: 주문 총액 반올림
SELECT order_id, ROUND(total_price, 0) AS total_rounded
FROM orders;
시나리오 2: 페이지 수 계산
SELECT CEIL(COUNT(*) / 10.0) AS pages_needed
FROM products;
시나리오 3: 학생을 3개 그룹으로 나누기
SELECT student_id,
MOD(student_id, 3) AS group_number
FROM students;
시나리오 4: 평균 제곱근 구하기
SELECT SQRT(AVG(POWER(score, 2))) AS root_mean_square
FROM grades;
자주 하는 실수 & 팁
ROUND()는 두 번째 인자도 받을 수 있으니까 소수 둘째 자리까지 반올림하려면 꼭 써줘.
MOD()는 음수랑 같이 쓰면 예상 못한 결과가 나올 수 있어.
POWER()랑 SQRT()는 소수 인자도 잘 받아. 필요하면 CAST()로 타입 변환해.
SQRT()에 음수가 들어가면 실행 에러 나니까 꼭 체크해!
GO TO FULL VERSION