Урок 3.2 · Время чтения: ~8 мин
В этом уроке вы изучите строковые функции SQL, которые помогают очищать и преобразовывать текстовые данные прямо в запросе. Мы разберем, когда применять UPPER, LOWER, TRIM, SUBSTRING, CONCAT и другие функции, а также посмотрим на практические примеры. К концу урока вы сможете уверенно обрабатывать текстовые поля в реальных задачах.
Основные строковые функции в SQL
В прошлом уроке вы познакомились со встроенными функциями SQL в целом. Теперь сфокусируемся на строковых функциях, потому что именно текстовые поля часто требуют дополнительной обработки: нормализации регистра, удаления лишних символов, склейки значений и извлечения фрагментов.
Эти операции постоянно встречаются в аналитике, отчетах и подготовке данных к экспорту. Чем лучше вы владеете строковыми функциями, тем меньше ручной обработки потребуется за пределами SQL.
Что такое строковые функции
Строковые функции работают с текстом и возвращают строку, число или позицию подстроки. Они полезны, когда нужно:
- привести текст к единому формату;
- очистить «шум» в данных;
- получить часть строки (например, домен email);
- собрать удобный текстовый вывод для отчетов.
Базовый синтаксис
FUNCTION_NAME(string_expression, ...)
Обычно аргументом выступает столбец таблицы, строковый литерал или результат другой функции.
Основные строковые функции
UPPER() и LOWER()
Используются для нормализации регистра текста.
SELECT
customer_id,
UPPER(last_name) AS last_name_upper,
LOWER(first_name) AS first_name_lower
FROM customer
LIMIT 5;
Результат: фамилия выводится в верхнем регистре, имя - в нижнем.
CHAR_LENGTH() и LENGTH()
Обе функции измеряют длину строки, но не всегда одинаково:
CHAR_LENGTH()обычно возвращает количество символов;LENGTH()в MySQL возвращает количество байтов.
SELECT
title,
CHAR_LENGTH(title) AS title_chars,
LENGTH(title) AS title_bytes
FROM film
LIMIT 5;
Примечание: для многобайтовых символов количество байтов может быть больше количества символов.
SUBSTRING(), LEFT(), RIGHT()
Эти функции извлекают часть строки.
SELECT
email,
SUBSTRING(email, 1, 5) AS email_start,
LEFT(email, 3) AS first_3,
RIGHT(email, 10) AS last_10
FROM customer
LIMIT 5;
Результат: из email извлекаются разные фрагменты для анализа и проверки формата.
CONCAT() и CONCAT_WS()
Функции объединяют несколько значений в одну строку:
CONCAT()склеивает аргументы подряд;CONCAT_WS(separator, ...)добавляет разделитель и обычно удобнее в отчетах.
SELECT
customer_id,
CONCAT(first_name, ' ', last_name) AS full_name,
CONCAT_WS(' | ', first_name, last_name, email) AS customer_label
FROM customer
LIMIT 5;
Примечание: поведение при NULL зависит от СУБД, поэтому проверяйте документацию вашей системы.
TRIM() и REPLACE()
Нужны для очистки текстовых данных.
SELECT
address,
TRIM(address) AS address_trimmed,
REPLACE(address, 'Street', 'St.') AS address_short
FROM address
LIMIT 5;
Результат: удаляются лишние пробелы и заменяются повторяющиеся текстовые шаблоны.
Поиск подстроки: POSITION() / INSTR() / CHARINDEX()
Название функции зависит от СУБД, но идея одна: найти позицию подстроки в строке.
SELECT
email,
INSTR(email, '@') AS at_pos
FROM customer
LIMIT 5;
Результат: возвращается позиция символа @, что удобно для валидации email.
На что стоит обращать внимание
- Проверяйте различия функций между СУБД: имена и поведение могут отличаться.
- Учитывайте
NULL: в строковых выражениях он часто «ломает» ожидаемый результат. - При работе с кириллицей и эмодзи используйте функции длины осознанно (символы vs байты).
- Не перегружайте один запрос десятком вложенных функций; лучше разбить логику на шаги.
Пример из практики: подготовка клиентских данных для рассылки
Ниже запрос, который подготавливает аккуратный список клиентов: очищает имя, нормализует email и извлекает домен.
SELECT
c.customer_id,
TRIM(CONCAT_WS(' ', c.first_name, c.last_name)) AS full_name,
LOWER(TRIM(c.email)) AS email_normalized,
SUBSTRING_INDEX(LOWER(TRIM(c.email)), '@', -1) AS email_domain
FROM customer AS c
WHERE c.email IS NOT NULL
ORDER BY c.customer_id
LIMIT 20;
Результат: вы получаете чистый и единообразный набор текстовых полей, готовый для аналитики или выгрузки.
Ключевые выводы этого урока:
- Строковые функции SQL помогают очищать, нормализовать и форматировать текст прямо в запросе.
UPPER,LOWER,TRIM,REPLACE,SUBSTRING,LEFT,RIGHTиCONCATпокрывают большинство базовых задач.- Для длины строк важно различать символы и байты.
- При объединении строк учитывайте поведение
NULLв вашей СУБД. - Практическая сила строковых функций раскрывается в реальных сценариях подготовки данных.
Вопросы для собеседования
Чем CHAR_LENGTH() отличается от LENGTH() и почему это важно?
CHAR_LENGTH() обычно возвращает количество символов, а LENGTH() в MySQL возвращает количество байтов. Для кириллицы и других многобайтовых символов результат может отличаться. Это важно при валидации длины полей и проверке бизнес-ограничений.
Как безопасно собрать полное имя, если одно из полей может быть NULL?
Часто используют CONCAT_WS(), потому что он удобнее при объединении строк с разделителем и лучше подходит для практических отчетов. Также полезно явно обрабатывать пустые значения через COALESCE(), чтобы получить предсказуемый результат в разных сценариях.
Какие строковые функции вы бы использовали для очистки email перед аналитикой?
Обычно применяют связку TRIM() + LOWER(), чтобы убрать лишние пробелы и привести адрес к единому регистру. Для проверки структуры можно дополнительно использовать поиск позиции @ через INSTR() или аналог в вашей СУБД.
В следующем уроке мы перейдем к математическим функциям SQL и разберем, как выполнять вычисления и числовую обработку в запросах.