Найти в Дзене
Идеальный блокчейн

SQL. Практика баз данных для хипстеров. Story #7

Я много лет страстно увлечен базами данных и программированием на языке SQL. Поверьте, это просто и увлекательно, к тому же высокооплачиваемое умение.

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

Содержание беседы #7:

Тема 2. Язык структурированных запросов

Раздел 2.3 Расширения языка: функции для работы со строками, датами, для ранжирования

Пункт 2.3.1 Функции для работы с числами

Пункт 2.3.3 Функции для работы с текстом

Термин «функция» применительно к языку SQL близок к понятию математической функции: это некое преобразование по определенному правилу входного значения, чтобы получить выходное значение.

Еще следует знать, что есть встроенные функции, являющиеся расширением Стандарта языка, а есть пользовательские функции, которые может сделать любой программист SQL.

При использовании функций хипстеру достаточно знать их название, порядок и тип аргументов функции и точно понимать: какое преобразование функция сделает? В плане использования в разных разделах запроса, функция может находиться там же, где и константа: в любом разделе запроса. Потому что из встроенных функций всегда возвращается одно значение.

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

Функции для работы с числами.

Такие функции отражают обычные математические потребности.

+ - * /

Прочие разберем в других беседах, ибо они реже используются. Быстро мы прошли этот подраздел, правда? )

Функции для работы с датой.

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

Функции для работы с текстом.

Все многообразие преобразований текста можно свести всего к нескольким основным типам. Вот основные функции, которые непременно понадобятся в повседневной практике:

· Взять часть строки

Left – взять слева из строки указанное количество символов;
Right – взять справа из строки указанное количество символов;
Substring – взять указанное количество символов начиная с указанного по номеру символа;
Len – взять длину строки;

· Найти что-то в строке

Charindex – найти первое (начиная слева) вхождение в строку указанного символа;
Patindex – найти первое (начиная слева) вхождение в строку некого заданного пользователем набора символов с использованием регулярных выражений (пока не бери в усатую голову :-З , ведь это тема отдельного раздела);

· Изменить строку

+ или || – это функции объединения нескольких строк;

Replace – заменить в строке указанную последовательность символов на другую указанную последовательность символов;
Ltrim, Rtrim, Trim – удаляют начальные или концевые пробелы.

Есть еще десяток-другой функций, но они используются редко и в таком случае не составит труда найти их в любом справочнике или почитать мою отдельную беседу.

Рассмотрим функции чуть подробнее, обещаю, что без занудства :-P

В группе функций Left, Right, Substring главная - Substring:

Substring (<сама строка>, <начальная позиция>, <длина> )

Результат функции – «вырезанный», необходимый кусочек строки.

Две другие функции просто делают жизнь проще и красивее, хотя можно было обойтись и без них:

Left (<сама строка>, <сколько символов слева взять>)
Right (<сама строка>, <сколько символов справа взять>)

Найти что-то в строке - значит получить порядковый номер символа с которого начинается интересующая нас подстрока.

Когда мы точно знаем что искать (конкретную подстроку, типа "мама"), то

Charindex(<что ищем, т.е. указываем 1 или несколько символов>, <сама строка>)

Повторюсь, здесь в результате мы получим не текст, а номер позиции в строке с первым вхождением или цифру ноль, если строка не содержит указанные символы.

Когда мы ищем несколько вариантов или в точности не знаем что ищем (типа, "Ал", ожидая найти "Алексей", "Александр" и др.), то маска поиска должна быть задана неявно:

Patindex(<что ищем, т.е. указываем маску поиска>, <сама строка>)

Чтобы хорошо понять эту функцию необходимо иметь представление о регулярных выражениях (тема из соседнего раздела).

Далее, самое простое изменение строки это сложение (объединение строк). Для этого служат незатейливые функции: + или ||

Если изменение строки более сложное, то речь, скорее всего, идет о замене части символов:

Replace(<сама строка>, <заменим это>, <на вот это>)

Наконец, есть особый вид изменений – удалить пустые строки вначале и конце строки (постоянно встречающаяся типичная задача). Можно воспользоваться Replace(Stroka, ‘ ’, ‘’), т.е. заменить пробел на пустую строку. Но для удобства хипстеров создатели языка ввели специальные функции:

Ltrim(<сама строка>) – удалить пробелы в начале строки.
Rtrim(<сама строка>) – удалить пробелы в конце строки.
Trim(<сама строка>) – удалить пробелы сначала и в конце строки.

Часто этими функциями придется пользоваться, если в базе данных есть поля типа char. Если в поле такого типа и размера, например, 10 указано меньше 10 символов, то по-умолчанию в конце будут добавлены пробелы до 10 символов в сумме. И при выводе на экран или при объединении, изменении строк от них обычно нужно избавляться.

Всё, дорогой друг, указанный набор функций покрывает более 95% задач по написанию запросов в SQL. Что мне особенно нравится в языке структурированных запросов, так это его незатейливость. Для написания простого запроса необходимо знать всего пару-тройку команд, остальное же можно усваивать по мере появления более сложных задач. Для контраста попробуйте оценить: сколько вам нужно знаний для вывода "Hello, world!" в c++, c# и в sql.

select 'Hello, world!'

Спасибо, что дочитали до конца! Любите друг друга... и базы данных)

Автор: Щукин Андрей (vk.com/faustonly), Санкт-Петербург. Дата публикации: 06.05.2018