SQL (Structured Query Language) — это язык программирования, который используется для работы с базами данных. Одним из мощных инструментов в SQL являются функции. Они позволяют выполнять вычисления, преобразования данных и анализ прямо в запросах. В этой статье мы разберем, что такое функции в SQL, на примерах MySQL — одной из самых популярных систем управления базами данных (СУБД).
Ниже мы рассмотрим основные типы функций, как они работают и приведем простые примеры.
dbaas
Что такое функция в SQL
Функции в SQL — это готовые инструменты, которые принимают входные значения (аргументы), выполняют с ними определенные действия и возвращают результат. Функции позволяют проводить вычисления и манипуляции с данными прямо в запросе, не обрабатывая их потом в коде вашего приложения что экономит время и ресурсы. Результаты будут получены сразу из базы, что особенно важно при работе с большими объемами данных.
Например, представьте, что у вас в таблице хранятся имена пользователей в разном регистре (иван, МАРИЯ, Петр). Вместо того чтобы выгружать все имена и приводить их к одному регистру в вашей программе на Python или PHP, вы можете сделать это сразу в запросе с помощью функции LOWER() или UPPER().
SELECT UPPER('иван');
Результат:
ИВАН
Помимо простого преобразования текста, функции в SQL позволяют работать с числами, датами, строками и даже агрегировать данные. Например, вы можете использовать функции для подсчета количества записей, нахождения максимального или минимального значения в столбце, вычисления средних значений и сумм. Это особенно полезно при аналитике данных, когда нужно быстро получить результаты без написания сложного кода в приложении.
Виды функций в MySQL
Функции в MySQL можно условно разделить на несколько категорий:
- Строковые функции — работают с текстом (объединение, обрезка, поиск, замена).
- Числовые функции — выполняют математические операции (округление, возведение в степень).
- Функции даты и времени — позволяют извлекать части даты, форматировать их, складывать и вычитать.
- Агрегатные функции — вычисляют значения на основе нескольких строк (сумма, среднее значение, количество).
- Функции управления потоком — позволяют реализовывать условную логику прямо в SQL (аналог
if-else). - Пользовательские функции — создаются вручную для специфических задач.
В MySQL функции встроены в язык, и их синтаксис может немного отличаться от других СУБД (например, PostgreSQL или Oracle).
Теперь давайте рассмотрим каждую категорию подробнее.
Строковые функции
Строковые функции манипулируют текстом: меняют регистр, объединяют строки, извлекают подстроки. Такие функции используются для обработки имен пользователей, адресов, описаний, комментариев.
-
CONCAT(str1, str2, ...)
Объединяет несколько строк в одну.
SELECT CONCAT('Привет', ' ', 'мир!');
Результат: Привет мир!
Или:
SELECT CONCAT(first_name, ' ', last_name) AS full_name
FROM users;
Результат: Из столбцов first_name = 'Иван' и last_name = 'Петров' получится 'Иван Петров'.
-
LOWER(str) и UPPER(str)
Приводят строку к нижнему или верхнему регистру.
SELECT UPPER('Привет мир!') AS upper_text;
Результат: 'ПРИВЕТ МИР!'
-
LENGTH(str)
Возвращает длину строки в байтах.
SELECT LENGTH('MySQL') AS str_length;
Результат: 5
Функция LENGTH возвращает длину строки в байтах, поэтому если сделать запрос с кириллицей:
SELECT LENGTH('Привет') AS str_length;
— результат будет 12, а не 6, как можно было бы ожидать, потому что каждый кириллический символ занимает 2 байта.
-
CHAR_LENGTH()
Возвращает длину строки в символах.
CHAR_LENGTH('Привет') AS chars;
Результат: 6
-
SUBSTRING(str, start, length)
Извлекает часть строки из строки str, начиная с позиции start и длиной length символов.
SELECT SUBSTRING('timeweb.ru', 1, 7) AS domain_part;
Результат: 'timeweb'
-
REPLACE(str, from_str, to_str)
Заменяет все вхождения подстроки from_str на to_str в строке str.
SELECT REPLACE('Я люблю Python', 'Python', 'SQL') AS new_text;
Результат: 'Я люблю SQL'
-
TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str)
Удаляет пробелы (или другие символы) с начала и/или конца строки.
SELECT TRIM(' Привет мир! ') AS trimmed_text;
Результат: 'Привет мир!'
Числовые функции
Эти функции помогают проводить расчеты с числовыми данными. Вы можете округлять, вычислять остаток, получать случайные значения и многое другое.
-
ROUND(number, [decimals])
Округляет число до указанного количества знаков после запятой.
SELECT ROUND(3.14159, 2) AS rounded_number;
Результат: 3.14
-
CEILING(number) и FLOOR(number)
Округляют число до ближайшего большего или меньшего целого соответственно.
SELECT CEILING(45.01), FLOOR(45.99);
Результат: 46, 45
-
ABS(number)
Возвращает модуль числа.
SELECT ABS(-10) AS absolute_value;
Результат: 10
-
POWER(X, Y)
Возводит X в степень Y.
SELECT POWER(2, 8) AS power_result;
Результат: 256
-
MOD(n, m)
Возвращает остаток от деления n на m.
SELECT MOD(10, 3) AS remainder;
Результат: 1
Часто такие функции полезны при аналитических запросах, например при подсчете среднего или округлении цен.
Функции для работы с датами и временем
Эти функции помогают получать текущую дату, извлекать части даты (год, месяц, день), а также вычислять разницу между ними.
-
NOW()
Возвращает текущие дату и время.
SELECT NOW() AS current_datetime;
Результат: '2025-10-19 08:52:18'
-
CURDATE() и CURTIME()
Возвращают текущую дату и текущее время по отдельности.
-
DATE(date) и TIME(datetime)
Извлекают из даты-времени только дату или только время.
SELECT DATE(NOW()) AS today;
Результат: '2025-10-19'
-
DATEDIFF(date1, date2)
Возвращает разницу в днях между двумя датами (date1 - date2).
SELECT DATEDIFF('2025-12-31', NOW()) AS days_left;
Результат: Количество дней до Нового года от текущей даты.
-
DATE_ADD(date, INTERVAL expr unit) и DATE_SUB(...)
Добавляет или вычитает интервал из даты.
-- Какая дата будет через 10 дней?
SELECT DATE_ADD(NOW(), INTERVAL 10 DAY) AS date_in_10_days;
-- Какая дата была 3 месяца назад?
SELECT DATE_SUB(NOW(), INTERVAL 3 MONTH) AS date_3_months_ago;
-
YEAR(date), MONTH(date), DAY(date)
Извлекают год, месяц и день из даты.
SELECT YEAR('2025-10-19') AS year_part;
Результат: 2025
Агрегатные функции
Это те функции, что работают с группой строк, объединенных с помощью GROUP BY, и возвращают одно значение.
-
COUNT(expr)
Подсчитывает количество строк. COUNT(*) считает все строки, COUNT(column) считает строки, где column не NULL.
SELECT COUNT(*) AS total_users FROM users;
SELECT COUNT(email) AS users_with_email FROM users; -- не посчитает строки, где email = NULL
-
SUM(column)
Возвращает сумму значений в столбце.
SELECT SUM(salary) AS total_salary FROM employees;
-
AVG(column)
Возвращает среднее арифметическое значений в столбце.
SELECT AVG(age) AS average_age FROM customers;
-
MIN(column) и MAX(column)
Возвращают минимальное и максимальное значение в столбце.
SELECT MIN(price) AS cheapest_product, MAX(price) AS most_expensive_product FROM products;
Пример с GROUP BY: Допустим, у нас есть таблица orders с заказами, и мы хотим узнать общую сумму заказов для каждого клиента.
SELECT customer_id, SUM(amount) AS total_spent
FROM orders
GROUP BY customer_id;
Этот запрос сгруппирует все заказы по customer_id и для каждой группы (т.е. для каждого клиента) посчитает сумму по столбцу amount.
Функции управления потоком
Иногда нужно добавить немного логики прямо в SQL-запрос. Для этого есть функции вроде IF() и CASE.
-
IF(condition, value_if_true, value_if_false)
Классический оператор «если».
SELECT name, age,
IF(age >= 18, 'Совершеннолетний', 'Несовершеннолетний') AS status
FROM people;
-
CASE
Более мощная и гибкая конструкция для множественных условий. Аналог switch или if...else if...else в других языках.
SELECT name, salary,
CASE
WHEN salary < 30000 THEN 'Начальный уровень'
WHEN salary BETWEEN 30000 AND 70000 THEN 'Средний уровень'
ELSE 'Высокий уровень'
END AS salary_grade
FROM employees;
Эти функции часто используются для подготовки отчетов или фильтрации данных без необходимости писать дополнительный код на стороне приложения.
Пользовательские функции
MySQL также позволяет создавать собственные функции, если стандартных возможностей недостаточно.
Синтаксис:
CREATE FUNCTION my_discount(price DECIMAL(10,2))
RETURNS DECIMAL(10,2)
DETERMINISTIC
RETURN price * 0.9;
Разберем построчно:
CREATE FUNCTION my_discount(price DECIMAL(10,2))
CREATE FUNCTION— директива создания функции в базе данных.my_discount— имя функции. Имя должно быть уникальным среди функций в вашей схеме (базы данных).(price DECIMAL(10,2))— список параметров. Здесь один параметр price с типомDECIMAL(10,2).DECIMAL(10,2), как мы изучили выше, означает, что максимальная общая длина 10 цифр, из которых 2 — после десятичной точки.- Параметр является входным (
IN). По умолчанию вCREATE FUNCTIONпараметры —IN.
RETURNS DECIMAL(10,2)
- Указывает тип возвращаемого значения. Функция вернет
DECIMAL(10,2). - Очень важно сопоставлять возвращаемый тип с реальными вычислениями, иначе MySQL может привести или округлить результат. В нашем случае результат умножения
price * 0.9будет приведен кDECIMAL(10,2).
DETERMINISTIC
- Атрибут, указывающий, что при одинаковых входных значениях функция всегда возвращает один и тот же результат и не зависит от внешнего состояния (например, от таблиц, системного времени, случайных чисел и т. п.).
- Это важно для оптимизатора и для репликации: MySQL сможет кэшировать результат или безопаснее выполнять запросы на репликах.
- Если функция использует
NOW()/ чтение из таблицы /RAND()— она не детерминированна, и не следует ставитьDETERMINISTIC.
Есть также противоположный атрибут NOT DETERMINISTIC.
RETURN price * 0.9;
- Тело функции — единственное выражение, которое возвращает значение. Здесь мы просто возвращаем
price, умноженное на 0.9, — то есть отдаем цену со скидкой 10%.
Теперь ее можно использовать как встроенную:
SELECT my_discount(100);
-- 90.00
Или:
SELECT id, price, my_discount(price) AS discounted_price
FROM products;
Такие функции удобно использовать, если у вас есть повторяющиеся вычисления (например, скидки, налоги, формулы бонусов).
Комбинирование функций
Еще одна важная особенность SQL-функций заключается в том, что их можно вкладывать друг в друга. Это значит, что результат одной функции может быть использован как аргумент для другой функции.
Пример:
SELECT CONCAT(
UPPER(customer),
' — заказ на ',
ROUND(amount, 0),
' руб.'
) AS summary
FROM orders;
Результат:
|
summary |
|
АЛЕКСАНДР — заказ на 121 руб. |
|
КАТЯ — заказ на 80 руб. |
|
АЛЕКСАНДР — заказ на 50 руб. |
Практический пример: аналитика заказов
Допустим, у вас интернет-магазин, и нужно быстро получить отчет:
- сколько заказов сделали клиенты,
- какая средняя сумма заказа,
- и какая категория по размеру заказа.
Запрос может выглядеть так:
SELECT
customer,
COUNT(*) AS total_orders,
ROUND(AVG(amount), 2) AS avg_order,
CASE
WHEN AVG(amount) >= 100 THEN 'Премиум'
WHEN AVG(amount) >= 50 THEN 'Стандарт'
ELSE 'Бюджет'
END AS segment
FROM orders
GROUP BY customer;
Результат:
|
customer |
total_orders |
avg_order |
segment |
|
Александр |
2 |
85.25 |
Стандарт |
|
Катя. |
1 |
80.00 |
Стандарт |
Такая комбинация функций делает SQL очень гибким инструментом для обработки данных. Она позволяет создавать сложные запросы без необходимости писать много дополнительного кода, что упрощает работу с базой и ускоряет получение нужной информации.
Заключение
Функции в SQL — это мощный инструмент, который позволяет работать с данными на уровне базы: очищать, форматировать, анализировать и вычислять прямо внутри SQL.
Это позволяет:
- Разгрузить код приложения, перенося логику на сервер БД.
- Повысить производительность, так как операции часто выполняются быстрее внутри СУБД.
Кроме того, использование функций улучшает читаемость и поддерживаемость запросов. Вместо длинных и сложных вычислений в коде приложения вы получаете компактные и понятные конструкции прямо в SQL-запросах. Функции также помогают стандартизировать обработку данных — например, все текстовые поля можно приводить к одному регистру или удалять лишние пробелы одинаковым образом, что снижает вероятность ошибок. Не менее важна безопасность: выполнение вычислений на стороне базы данных уменьшает количество данных, передаваемых в приложение, а значит, снижает риски утечки или некорректной обработки.
Лучший способ освоить функции — практика. Создайте тестовую базу данных, наполните ее данными и экспериментируйте с разными функциями, комбинируя их в своих запросах. Вскоре вы обнаружите, что работа с SQL становится гораздо более эффективной и интересной.
Не бойтесь комбинировать функции между собой: например, вы можете сначала извлечь часть строки, потом изменить регистр текста, а затем подсчитать количество символов. Такие вложенные функции открывают широкие возможности для анализа данных. Также стоит изучить пользовательские функции (CREATE FUNCTION), которые позволяют создавать свои собственные операции, недоступные в стандартном наборе MySQL. Это особенно полезно для сложной логики или специфических вычислений, характерных для вашего проекта.
