❤️ Спасибо всем, кто поддержал проект! В прошлом месяце вы задонатили почти $100 — это позволяет в этом месяце держать сервис бесплатным для всех. Очень надеюсь на вашу поддержку и в следующем месяце. Поддержать →
SQL код скопирован в буфер обмена
EN PT FR

Урок 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 и разберем, как выполнять вычисления и числовую обработку в запросах.