Загрузка данных
Лабораторная работа «Математические функции»
1. Теоретическая часть.
В реальной работе с базами данных часто требуется производить расчёты: округлять
цены до целых рублей, вычислять скидки и налоги, определять разницу между
плановыми и фактическими показателями, генерировать случайные выборки для
тестирования. Математические функции позволяют делать это прямо в SQL-запросах, не
выгружая данные во внешние программы
Основные математические функции:
Функция Описание Пример Результат
Округление
ROUND(x, d)
Округление до d знаков после
запятой ROUND(15.678, 2) 15.68
FLOOR(x) Округление вниз до целого FLOOR(15.9) 15
CEIL(x) /
CEILING(x) Округление вверх до целого CEIL(15.1) 16
TRUNCATE(x, d)
Отбрасывание знаков без
округления
TRUNCATE(15.678,
2) 15.67
Абсолютное значение
и знак
ABS(x)
Модуль числа (абсолютная
величина) ABS(-15) 15
SIGN(x) Знак числа: -1, 0 или 1 SIGN(-15) -1
Степень и корень
POW(x, y) /
POWER(x, y) Возведение x в степень y POW(2, 3) 8
SQRT(x) Квадратный корень SQRT(25) 5
Остаток от деления
MOD(x, y) Остаток от деления x на y MOD(17, 5) 2
x % y То же самое (оператор) 17 % 5 2
Случайные числа
RAND() Случайное число от 0 до 1 RAND() 0.734512...
RAND(seed)
Случайное число с
фиксированным зерном RAND(42)
всегда
одинаково
Тригонометрия
(редко, но есть)
PI() Число π PI() 3.141593...
SIN(x) , COS(x) ,
TAN(x)
Тригонометрические
функции (в радианах) SIN(PI()/2) 1
Логарифмы
LOG(x) Натуральный логарифм LOG(2.71828) ~1
LOG10(x) Десятичный логарифм LOG10(100) 2
EXP(x) Экспонента (e^x) EXP(1) ~2.71828
Наибольшее /
наименьшее
GREATEST(a, b, ...) Максимальное из списка
GREATEST(10, 20,
5) 20
LEAST(a, b, ...) Минимальное из списка LEAST(10, 20, 5) 5
2 Пример выполнения заданий:
1. Задание.
Выведите список всех товаров: название, закупочную цену (purchase_price), розничную
цену (retail_price). Добавьте три новые колонки:
• price_rounded — розничная цена, округлённая до целого числа (функция ROUND с
0 знаков).
• price_floor — розничная цена, округлённая вниз до целого (функция FLOOR).
• price_ceil — розничная цена, округлённая вверх до целого (функция CEIL).
SELECT
name,
purchase_price,
retail_price,
ROUND(retail_price, 0) AS price_rounded,
FLOOR(retail_price) AS price_floor,
CEIL(retail_price) AS price_ceil
FROM products;
2 Задание.
Выведите название товара, закупочную цену и новую колонку price_with_kopecks, в
которой розничная цена показана с ровно двумя знаками после запятой, даже если в
исходных данных один знак или целое число.
SELECT
name,
purchase_price,
ROUND(retail_price, 2) AS price_with_kopecks
FROM products;
3 Задание.
Выведите название товара, закупочную цену и новую колонку truncated_price, в которой
розничная цена обрезана до целого числа (без округления, просто отброшена дробная
часть).
SELECT
name,
retail_price,
TRUNCATE(retail_price, 0) AS truncated_price,
FLOOR(retail_price) AS floor_price
FROM products;
4 Задание.
Посчитайте наценку для каждого товара как разницу между розничной и закупочной
ценой. Выведите название товара, закупочную цену, розничную цену, разницу (наценку)
и абсолютное значение этой разницы (функция ABS).
SELECT
name,
purchase_price,
retail_price,
retail_price - purchase_price AS markup,
ABS(retail_price - purchase_price) AS abs_markup
FROM products;
5 Задание.
Для каждого товара вычислите квадрат его веса (weight_kg в квадрате). Выведите
название товара, вес и новую колонку weight_squared.
SELECT
name,
weight_kg,
POW(weight_kg, 2) AS weight_squared
FROM products
WHERE weight_kg IS NOT NULL;
6 Задание.
Выведите список всех товаров: название, количество на складе. Добавьте новую
колонку remainder_10, которая показывает остаток от деления количества на 10.
SELECT
name,
quantity,
MOD(quantity, 10) AS remainder_10,
quantity % 10 AS remainder_operator
FROM products;
7 Задание
Выведите товары, у которых количество на складе кратно 5 (то есть остаток от деления
на 5 равен 0).
SELECT
name,
quantity
FROM products
WHERE MOD(quantity, 5) = 0;
8 Задание
Выведите список всех товаров. Для каждого товара сгенерируйте случайное число от 0
до 1 и выведите его в колонке random_value.
SELECT
name,
RAND() AS random_value
FROM products;
9 Задание.
Сгенерируйте для каждого товара случайную скидку в процентах от 5 до 25. Выведите
название товара, текущую скидку (discount_percent) и новую колонку random_discount.
SELECT
name,
discount_percent AS current_discount,
FLOOR(5 + RAND() * 21) AS random_discount
FROM products;
10 Задание.
Выберите 3 случайных товара из таблицы.
SELECT
name,
retail_price
FROM products
ORDER BY RAND()
LIMIT 3;
Задания.
1. Задание 1
Выведите список всех рейсов: номер грузовика, вес груза, потраченное топливо.
Добавьте три новые колонки:
o fuel_rounded — топливо, округлённое до целого числа (функция ROUND с 0 знаков).
o fuel_floor — топливо, округлённое вниз до целого (функция FLOOR).
o fuel_ceil — топливо, округлённое вверх до целого (функция CEIL).
2. Задание 2
Выведите номер грузовика, расстояние маршрута (из таблицы routes) и новую
колонку distance_with_one_decimal, в которой расстояние показано с ровно одним
знаком после запятой. Используйте ROUND или TRUNCATE и соединение таблиц
(JOIN).
3. Задание 3
Выведите номер грузовика, вес груза и новую колонку truncated_weight, в которой вес
груза обрезан до целого числа (без округления, просто отброшена дробная часть).
Используйте TRUNCATE.
4. Задание 4
Для каждого рейса вычислите расход топлива на 100 км по формуле: (fuel_consumed_l /
distance_km) * 100. Выведите номер грузовика, расстояние, потраченное топливо, расход
на 100 км (округлите до двух знаков) и абсолютное значение этого расхода
(функция ABS).
5. Задание 5
Для каждого рейса вычислите квадрат расстояния маршрута. Выведите номер грузовика,
расстояние и новую колонку distance_squared. Используйте функцию POW.
6. Задание 6
Для рейсов, у которых вес груза превышает 10000 кг, вычислите квадратный корень из
веса груза. Выведите номер грузовика, вес груза и новую колонку sqrt_weight.
Используйте SQRT. Округлите результат до двух знаков после запятой.
7. Задание 7
Выведите список всех рейсов: номер грузовика, вес груза. Добавьте новую
колонку remainder_1000, которая показывает остаток от деления веса груза на 1000.
Используйте функцию MOD или оператор %.
8. Задание 8
Выведите рейсы, у которых вес груза кратен 500 кг (то есть остаток от деления на 500
равен 0). Используйте MOD в условии WHERE.
9. Задание 9
Для каждого рейса сгенерируйте случайный бонус водителю в процентах от 3 до 18.
Выведите номер грузовика, текущий бонус и новую колонку random_bonus.
Используйте формулу с FLOOR и RAND().
10.Задание 10
Выберите 3 случайных рейса из таблицы trips. Выведите номер грузовика, дату рейса и
вес груза. Используйте ORDER BY RAND() и LIMIT.
бд:
-- phpMyAdmin SQL Dump
-- version 5.2.0
-- https://www.phpmyadmin.net/
--
-- Хост: 127.0.0.1:3306
-- Время создания: Апр 19 2026 г., 16:32
-- Версия сервера: 10.4.26-MariaDB
-- Версия PHP: 7.2.34
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- База данных: `math_work`
--
-- --------------------------------------------------------
--
-- Структура таблицы `routes`
--
CREATE TABLE `routes` (
`id` int(11) NOT NULL,
`origin` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Город отправления',
`destination` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Город назначения',
`distance_km` decimal(8,2) NOT NULL COMMENT 'Расстояние в километрах',
`base_price_per_km` decimal(6,2) NOT NULL COMMENT 'Базовая ставка за 1 км'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Дамп данных таблицы `routes`
--
INSERT INTO `routes` (`id`, `origin`, `destination`, `distance_km`, `base_price_per_km`) VALUES
(1, 'Москва', 'Санкт-Петербург', '712.50', '35.50'),
(2, 'Москва', 'Казань', '820.30', '32.00'),
(3, 'Москва', 'Ростов-на-Дону', '1075.80', '28.50'),
(4, 'Санкт-Петербург', 'Казань', '1520.00', '30.00'),
(5, 'Казань', 'Екатеринбург', '950.75', '33.50'),
(6, 'Екатеринбург', 'Новосибирск', '1480.20', '29.00'),
(7, 'Новосибирск', 'Иркутск', '1850.60', '31.50');
-- --------------------------------------------------------
--
-- Структура таблицы `trips`
--
CREATE TABLE `trips` (
`id` int(11) NOT NULL,
`route_id` int(11) NOT NULL,
`truck_number` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Госномер грузовика',
`cargo_weight_kg` decimal(10,2) NOT NULL COMMENT 'Вес груза в кг',
`fuel_consumed_l` decimal(8,2) NOT NULL COMMENT 'Потрачено топлива в литрах',
`trip_date` date NOT NULL,
`driver_bonus_percent` int(11) DEFAULT 0 COMMENT 'Бонус водителю в % от стоимости рейса'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Дамп данных таблицы `trips`
--
INSERT INTO `trips` (`id`, `route_id`, `truck_number`, `cargo_weight_kg`, `fuel_consumed_l`, `trip_date`, `driver_bonus_percent`) VALUES
(1, 1, 'А123ВС177', '12500.50', '205.75', '2025-04-10', 5),
(2, 1, 'К456МН77', '8300.00', '195.20', '2025-04-11', 0),
(3, 2, 'О789РХ116', '15200.75', '310.50', '2025-04-10', 7),
(4, 2, 'Т321УВ77', '9800.00', '280.30', '2025-04-12', 0),
(5, 3, 'Е654НК161', '20000.00', '420.00', '2025-04-09', 10),
(6, 3, 'М987ОР77', '17500.25', '405.50', '2025-04-13', 5),
(7, 4, 'С135ТУ78', '22000.00', '580.75', '2025-04-11', 8),
(8, 5, 'В246ХО196', '14500.50', '350.25', '2025-04-14', 0),
(9, 6, 'А579ЕК154', '18000.00', '490.00', '2025-04-12', 12),
(10, 7, 'Р802МС138', '25000.75', '650.50', '2025-04-15', 15),
(11, 1, 'Н111ОО77', '5600.00', '188.90', '2025-04-15', 0),
(12, 3, 'Г222ТТ161', '19100.00', '415.30', '2025-04-16', 5);
--
-- Индексы сохранённых таблиц
--
--
-- Индексы таблицы `routes`
--
ALTER TABLE `routes`
ADD PRIMARY KEY (`id`);
--
-- Индексы таблицы `trips`
--
ALTER TABLE `trips`
ADD PRIMARY KEY (`id`),
ADD KEY `route_id` (`route_id`);
--
-- AUTO_INCREMENT для сохранённых таблиц
--
--
-- AUTO_INCREMENT для таблицы `routes`
--
ALTER TABLE `routes`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8;
--
-- AUTO_INCREMENT для таблицы `trips`
--
ALTER TABLE `trips`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=13;
--
-- Ограничения внешнего ключа сохраненных таблиц
--
--
-- Ограничения внешнего ключа таблицы `trips`
--
ALTER TABLE `trips`
ADD CONSTRAINT `trips_ibfk_1` FOREIGN KEY (`route_id`) REFERENCES `routes` (`id`);
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;