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 товаров на страницу → нужно 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() не попадёт отрицательное число, иначе будет ошибка выполнения.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ