← К оглавлению занятия

✅ Решения

📁 Блок: SQL / MySQL / Пользовательские функции ⏱️ Время изучения: ~90 мин 🎯 Сложность: Продвинутая

⚡ Кратко: ✅ решения

Пользовательская функция в MySQL создаётся командой CREATE FUNCTION и возвращает одно значение.

Функция объявляет параметры, тип результата через RETURNS, тело между BEGIN и END, а результат отдаёт через RETURN.

Для MySQL в учебных примерах используется DELIMITER //, чтобы точки с запятой внутри тела не завершали весь скрипт раньше времени.

Ключевое свойство DETERMINISTIC означает, что при одинаковых входных данных функция возвращает одинаковый результат.

Минимальный пример: SELECT square_root(25); после создания функции square_root(x DOUBLE) вернёт квадратный корень.

Топ-3 ошибки: забыть DELIMITER, не указать RETURNS, использовать функцию с текущей датой как DETERMINISTIC без проверки документации.

Решение 1. Изменение регистра

DELIMITER //

CREATE FUNCTION to_uppercase(input_text VARCHAR(255))
RETURNS VARCHAR(255)
DETERMINISTIC
BEGIN
    RETURN UPPER(input_text);
END //

DELIMITER ;

SELECT to_uppercase('hello sql');

UPPER делает всю работу с регистром, а пользовательская функция даёт удобное имя для повторного использования.

Решение 2. Проверка чётности

DELIMITER //

CREATE FUNCTION is_even(number_value INT)
RETURNS BOOLEAN
DETERMINISTIC
BEGIN
    RETURN number_value % 2 = 0;
END //

DELIMITER ;

SELECT is_even(10), is_even(11);

Оператор % возвращает остаток от деления. Если остаток от деления на 2 равен нулю, число чётное.

Домашка. Площадь круга

DELIMITER //

CREATE FUNCTION circle_area(radius DECIMAL(10,2))
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
    RETURN PI() * POW(radius, 2);
END //

DELIMITER ;

Домашка. Гипотенуза

DELIMITER //

CREATE FUNCTION hypotenuse(side_a DECIMAL(10,2), side_b DECIMAL(10,2))
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
    RETURN SQRT(POW(side_a, 2) + POW(side_b, 2));
END //

DELIMITER ;