JavaRush /Курсы /Модуль 4. Работа с БД /Строковые функции

Строковые функции

Модуль 4. Работа с БД
4 уровень , 4 лекция
Открыта

Список строковых функций

Больше функций, чем у даты и времени, — только у типа String. Который в SQL задается типами CHAR(n) и VARCHAR(n). Вспомним самые популярные из них:

Функция Описание
1 LENGTH(str) Возвращает длину переданной строки в байтах
2 CHAR_LENGTH(str) Возвращает длину переданной строки в char’ах
3 LOCATE(substr,str), Ищет подстроку в строке аналогично методу indexOf()
4 LOCATE(substr,str,pos) Ищет подстроку в строке, начиная с символа pos
5 CONCAT(str1,str2,...) Склеивает несколько строк
6 SUBSTR(), SUBSTRING() Возвращает подстроку, заданную диапазоном символов
7 LOWER(str) Преобразует строку в нижний регистр
8 UPPER(str) Преобразует строку в верхний регистр
9 REPLACE() Заменяет подстроку в строке
10 MATCH() Проверяет совпадение строки заданному шаблону
11 TRIM(str) Обрезает пустые символы в начале и в конце строки
12 LTRIM(str) Обрезает пустые символы в начале строки
13 RTRIM(str) Обрезает пустые символы в конце строки
14 TO_BASE64(str) Преобразует строку в Base64
15 FROM_BASE64(str) Преобразует строку из Base64

Я специально сгруппировал функции в небольшие группы, чтобы было легче понять, как с ними работать. Ниже мы рассмотрим по одной функции из каждой группы. Полный список функций для работы со строками ты найдешь в официальной документации.

Преобразуем строку

Давай для начала разберемся с самыми простыми функциями, которые просто преобразовывают строку к немного другому виду. Например, преобразовывают строку в верхний и нижний регистр. В целом их поведение аналогично таким же функциям в языке Java.

Поэтому я просто приведу табличку с несколькими примерами.

# Запрос Результат
1 SELECT LENGTH('text') 4
2 SELECT LENGTH('Привет') 12
3 SELECT LOWER('Привет') привет
4 SELECT UPPER('Привет') ПРИВЕТ
5 SELECT SUBSTR('Привет', 2, 3) рив
6 SELECT SUBSTR('Привет как дела?', 8) как дела?

Функции работают ожидаемо, как и аналогичные им функции из JDK.

Единственный нюанс: в первой строке результат 4, а не 8. Все дело в том, что для кодировки латинских символов в запросе используется 1 байт (кодировка ASCII). Но если будешь работать с данными из базы данных, то длина строки будет зависеть от настроек кодировки базы данных. Тебя ждет много сюрпризов при работе с базой данных :)

Сложные действия со строками

Ну и давай разберем более сложные вещи при работе со строками. Что бы такое придумать…

Давай отобразим задания из таблицы task, и если deadline задания уже прошёл, то добавим к описанию задания слово EXPIRED!

Звучит интересно. Хотя сложные условия мы еще не учили, так что давай немного упростим задачу. Просто напишем запрос, который отобразит список прошедших задач, но к названию обязательно добавит слово “EXPIRED!”.

Для этого нам придется использовать функцию CONCAT:

 SELECT CONCAT( 'EXPIRED! ', name) FROM task WHERE deadline < CURDATE() 

Результат этого запроса будет таким:

concat('EXPIRED! ', name)
EXPIRED! Исправить багу на фронтенде

Рекомендация. Если тебе нужно просто преобразовать данные немного к другому виду, то это можно сделать и на уровне Java-кода. Но если ты хочешь использовать функции работы со строками на стороне SQL-сервера( внутри WHERE), то без них тебе точно не обойтись.

1
Задача
Модуль 4. Работа с БД, 4 уровень, 4 лекция
Недоступна
task0434
Напиши запрос, который из таблицы employee выберет длины имен (name) сотрудников в байтах и символах.
1
Задача
Модуль 4. Работа с БД, 4 уровень, 4 лекция
Недоступна
task0435
Напиши запрос, который из таблицы employee выберет имена (name) и позиции (position) сотрудников через дефис ('-'). Результат - одна колонка.
1
Задача
Модуль 4. Работа с БД, 4 уровень, 4 лекция
Недоступна
task0436
Напиши запрос, который из таблицы employee выберет первые 8 символов позиции (position) сотрудников.
1
Задача
Модуль 4. Работа с БД, 4 уровень, 4 лекция
Недоступна
task0437
Напиши запрос, который из таблицы employee выберет имена (name) сотрудников: первая колонка - просто имя, вторая - имя в нижнем регистре и третья - имя в верхнем регистре.
1
Задача
Модуль 4. Работа с БД, 4 уровень, 4 лекция
Недоступна
task0438
Напиши запрос, который из таблицы employee выберет позиции (position) сотрудников, но при этом, если в позиции встречается слово 'developer', то замени его на 'software developer'.
1
Задача
Модуль 4. Работа с БД, 4 уровень, 4 лекция
Недоступна
task0439
При вводе имен в БД кто-то, кажется, засыпал на пробеле. Напиши запрос, который из таблицы employee выберет имена (name) сотрудников: первая колонка - просто имя, вторая - имя с удалением пробелов с обоих сторон, третья - имя с удалением пробелов с левой стороны и четвертая - имя с удалением пробело
1
Задача
Модуль 4. Работа с БД, 4 уровень, 4 лекция
Недоступна
task0440
Напиши запрос, который из таблицы employee выберет имена (name) сотрудников: первая колонка - просто имя, вторая - имя преобразованное в base64.
1
Задача
Модуль 4. Работа с БД, 4 уровень, 4 лекция
Недоступна
task0441
Напиши запрос, который из таблицы employee выберет имена (name_b64) сотрудников в base64 в первую колонку и имена, преобразованные из base64, во вторую.
1
Задача
Модуль 4. Работа с БД, 4 уровень, 4 лекция
Недоступна
task0442
Напиши запрос, который из таблицы task выберет названия задач (title), которые являются истекшими (поле exp_date) на дату '2022-10-01'.
1
Задача
Модуль 4. Работа с БД, 4 уровень, 4 лекция
Недоступна
Тройка самых длинных городов
Напиши запрос, который из таблицы cities выберет 3 города (city), у которых самое большое количество букв в названии города.
1
Задача
Модуль 4. Работа с БД, 4 уровень, 4 лекция
Недоступна
Тройка самых коротких городов
Напиши запрос, который из таблицы cities выберет 3 города (city), у которых самое маленькое количество букв в названии города. После названия добавить через дефис количество букв в названии.
Комментарии (16)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Yuri S Уровень 50
22 июля 2025
изи
Александр Уровень 57
21 августа 2025
ага) COPY & PASTE
Fanil Magdiew Уровень 27 Expert
25 января 2024
захожу в последнюю задачу, а она уже решена до меня. Что происходит?)
Данила Уровень 111 Expert
19 ноября 2023
вообще не понял, последняя задача не принималась никак, даже когда в одну строчку всё написал и поставил в конце точку с запятой, правильное решение нажал и сработало, хотя не отличается вообще ничем
jvatechs Уровень 111 Expert
12 сентября 2023
Последняя задача: у кого не принимает, пишите все в одну строку.
hint1k Уровень 51
11 мая 2023

LENGTH(str)
Возвращает длину переданной строки в байтах
учитывая что 1) длина строки - это количество элементов строки 2) а количество байт которые занимает строка - это ее размер Правильне было бы так:

Возращает размер переданной строки в байтах
Ну и исправить по всему тексту, где неверно указана длина, вместо размера. p.s. Поскольку обязательно найдутся несогласные знатоки-языковеды, то им вопрос на засыпку:

 А какая у вас длина жесткого диска? 
hint1k Уровень 51
11 мая 2023

SUBSTR(), SUBSTRING()	
Возвращает подстроку, заданную диапазоном символов
Прочитав это, я бы написал так

substr("string", 2, 4)
и ожидал ответ "tri" - это символы в диапазоне между 2 и 4, что неверно. По факту:

первая цифра - это начало отсчета,
а вторая - количество символов в подстроке.
Поэтому правильно тут:

Возвращает подстроку, заданную начальным значением и количеством символов.
Валихан Уровень 33 Expert
8 марта 2025
Спасибо за пояснение! А то я не мог понять, откуда "рив". И еще в SQL в отличие от Java считается с 1 (а не с 0).
hint1k Уровень 51
11 мая 2023

LOCATE(substr,str,pos) 
Ищет подстроку в строке, начиная с символа pos
Прочитав это описание я бы написал такой код:

Locate("abc","abcddabc", d) 
ожидая в ответ "abc" после символа "d", что соответствует описанию. Поэтому тут все таки должно быть как-то так:

Ищет подстроку в строке, пропустив pos-1 символов от начала строки.
Саша И. Уровень 101 Expert
13 февраля 2023
В задачах много проблем с валидацией: может не принимать даже полностью верный код, но разнесённый на разные строки для читаемости (последняя задача, например).
Alexey Уровень 24
24 января 2023
Кому доступны задачи? У меня их нет. Подписка Premium
Зепп Бранниган Уровень 1 Moderator
25 января 2023
Задачи доступны для студентов университета.
Владимир Чугуевец Уровень 108 Expert
14 января 2023
в последней задаче нужна ; в конце