Функции в SQL: CREATE FUNCTION, RETURN
Что такое функции в SQL? 🛠️
Функции в SQL — это именованные блоки кода, которые выполняют конкретные задачи и возвращают результат. Они помогают избежать дублирования кода, упрощают сложные запросы и делают ваш SQL более читаемым.
Представьте, что вы пекарь 🧑🍳: вместо того чтобы каждый раз заново смешивать ингредиенты для торта, вы создаёте рецепт (функцию) и просто вызываете его, когда нужно испечь новый.
Синтаксис CREATE FUNCTION 📜
Базовая структура создания функции в SQL выглядит так:
CREATE FUNCTION имя_функции(параметры)
RETURNS тип_возвращаемого_значения
AS
BEGIN
-- Логика функции
RETURN результат;
END;
Пример: Простая функция для вычисления НДС 🧮
CREATE FUNCTION CalculateVAT(price DECIMAL(10, 2), tax_rate DECIMAL(5, 2))
RETURNS DECIMAL(10, 2)
AS
BEGIN
DECLARE @vat DECIMAL(10, 2);
SET @vat = price * tax_rate / 100;
RETURN @vat;
END;
Как это работает?
- Функция принимает price (цена) и tax_rate (ставка налога).
- Вычисляет НДС и возвращает его.
- Теперь можно использовать её в любом запросе:
SELECT
ProductName,
Price,
dbo.CalculateVAT(Price, 20) AS VAT -- Вычисляем НДС 20%
FROM Products;
Возвращаемые типы: RETURNS vs RETURN 🔄
Важно не путать:
- RETURNS — указывает тип данных, который вернёт функция (например, INT, VARCHAR, TABLE).
- RETURN — это ключевое слово внутри функции, которое передаёт результат.
Пример: Функция, возвращающая строку 📝
CREATE FUNCTION GetCustomerStatus(total_orders INT)
RETURNS VARCHAR(20)
AS
BEGIN
IF total_orders > 10
RETURN 'VIP';
ELSE
RETURN 'Regular';
END;
Использование:
SELECT
CustomerName,
dbo.GetCustomerStatus(OrderCount) AS Status
FROM Customers;
Возврат таблицы: RETURNS TABLE 📊
Функции могут возвращать не только скалярные значения, но и целые таблицы! Это мощный инструмент для создания гибких запросов.
Пример: Функция для выборки заказов за период 📅
CREATE FUNCTION GetOrdersByDateRange(
@start_date DATE,
@end_date DATE
)
RETURNS TABLE
AS
RETURN (
SELECT OrderID, OrderDate, TotalAmount
FROM Orders
WHERE OrderDate BETWEEN @start_date AND @end_date
);
Как использовать?
SELECT * FROM dbo.GetOrdersByDateRange('2023-01-01', '2023-12-31');
Когда использовать функции? ⚖️
✅ Плюсы:
- Упрощают сложные вычисления.
- Повышают переиспользуемость кода.
- Делают запросы чище.
❌ Минусы:
- Могут снижать производительность, если используются в массовых операциях.
- Не все СУБД поддерживают одинаковый синтаксис.
Практика: Создаём функцию для расчёта скидки 🎁
Давайте напишем функцию, которая рассчитывает скидку в зависимости от суммы покупки:
CREATE FUNCTION CalculateDiscount(total DECIMAL(10, 2))
RETURNS DECIMAL(10, 2)
AS
BEGIN
DECLARE @discount DECIMAL(10, 2) = 0;
IF total > 1000 SET @discount = total * 0.1; -- 10%
ELSE IF total > 500 SET @discount = total * 0.05; -- 5%
RETURN @discount;
END;
Тестируем:
SELECT
OrderID,
TotalAmount,
dbo.CalculateDiscount(TotalAmount) AS Discount
FROM Orders;
Итоги 🏁
Теперь вы знаете:
🔹 Как создавать функции с помощью CREATE FUNCTION.
🔹 Как возвращать разные типы данных (RETURNS).
🔹 Как использовать функции в реальных запросах.
Попробуйте написать свою первую функцию прямо сейчас! Например, функцию, которая форматирует телефонные номера или вычисляет возраст по дате рождения.
Если хотите глубже разобраться в SQL, посмотрите уроки Данилы Бежина на YouTube: https://www.youtube.com/@DanilaBezhin. Он отлично объясняет сложные тесты простыми словами!