В MySQL пользовательские функции (User—Defined Functions, UDF) — это подпрограммы, которые можно создавать для выполнения определенного действия и возврата значения. Они бывают двух основных типов: хранимые функции, написанные на SQL и хранящиеся в базе данных, и динамические UDF, реализуемые как внешние библиотеки и подключаемые через команду CREATE FUNCTION. Кроме этого, в MySQL существуют агрегатные, аналитические и скалярные функции.
Типы пользовательских функций
Хранимые функции (Stored Functions)
Это фрагменты кода на языке SQL, которые хранятся непосредственно в базе данных.
Они создаются с помощью команды CREATE FUNCTION и доступны после создания на сервере MySQL.
Используются для инкапсуляции логики и повторного использования кода, например, для вычисления сложных значений.
Динамические UDF
Это функции, реализованные на внешнем языке программирования (например, C/C++).
Они компилируются в виде библиотек и подключаются к серверу MySQL с помощью команд CREATE FUNCTION и DROP FUNCTION.
Этот механизм позволяет расширять возможности MySQL функциями, которые недоступны в стандартном SQL.
Как работают функции
Скалярные функции выполняют вычисления и возвращают одиночное значение (например, LOWER() для приведения к нижнему регистру).
Агрегатные функции обрабатывают набор значений и возвращают одно сводное значение (например, SUM(), AVG(), COUNT()).
MySQL также поддерживает аналитические функции, которые выполняют вычисления на наборе строк, связанных с текущей строкой, и ранжирующие функции.
Пример использования (хранимая функция)
# Создание хранимой функции
DELIMITER $$
CREATE FUNCTION GetFullName(firstName VARCHAR(50), lastName VARCHAR(50))
RETURNS VARCHAR(101)
DETERMINISTIC
BEGIN
RETURN CONCAT(firstName, ' ', lastName);
END $$
DELIMITER ;
# Использование функции
SELECT GetFullName('Руслан', 'Сарматов');
Этот пример создает функцию GetFullName, которая объединяет имя и фамилию в полное имя, и демонстрирует ее использование.
Пример 2. Напишем функцию в процедурном стиле, чтобы показать, что так тоже можно.
CREATE FUNCTION shop_db.get_premium_percentage() # DETERMINISTIC, NO SQL, or READS SQL DATA – задаем тип возвращаемого результата функцией RETURNS float READS SQL DATA BEGIN DECLARE premium_user_count INT; DECLARE total_users_count INT; DECLARE _result FLOAT; SET premium_users_count = ( SELECT count(*) FROM users_settings WHERE is_premium_account = TRUE ); SET total_users_count = ( SELECT count(*) FROM users_settings ); SET _result = premium_users_count / total_users_count; RETURN _result; END