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() не потрапить від'ємне число, інакше буде помилка виконання.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ