Функции в 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. Он отлично объясняет сложные тесты простыми словами!

Скрыть рекламу навсегда

🧠 Учёба без воды и зубрёжки

Закрытый Boosty с наработками опытного преподавателя.

Объясняю сложное так, чтобы щелкнуло.

🚀 Забрать доступ к Boosty