Применение функций
При составлении SQL запросов мы можем использовать встроенные функции. Например, если мы хотим вывести строку в верхнем регистре, то для этого мы можем использовать функцию UPPER.
SELECT UPPER("Hello world") AS upper_string;
Что такое встроенная функция?
Встроенная функция – реализованный в СУБД кусок кода, с помощью которого можно выполнять преобразования строковых, числовых и других данных в запросах.
Каждая функция принимает набор аргументов определённого типа, выполняет заложенные в неё операции и обязательно возвращает один из возможных литералов. Стоит отметить, что функции могут принимать как ноль аргументов, так и несколько.
Например, функция NOW() принимает ноль аргументов и возвращает литерал в формате даты, а LENGTH('sql-academy') принимает один строковый аргумент и возвращает числовой литерал «11».
Примеры функций
Функций достаточно много, но основные всегда можно найти с помощью поиска в шапке или же на странице справочника функций.
Вот некоторые из них:
-
LOWER
Возвращает строку, в которой все символы записаны в нижнем регистре
SELECT LOWER('SQL Academy') AS lower_string;
-
YEAR
Возвращает год для указанной даты
SELECT YEAR("2022-06-16") AS year;
-
INSTR
Осуществляет поиск подстроки в строке, возвращая позицию её первого символа. При этом отсчёт начинается с единицы, а не нуля, как в большинстве языков программирования.
Функция работает путём посимвольного сравнения исходной строки с искомой. Например, в строке sql-academy подстрока academy появляется, начиная с пятого символа.
SELECT INSTR('sql-academy', 'academy') AS idx;
-
LENGTH
Возвращает длину указанной строки.
SELECT LENGTH('sql-academy') AS str_length;
Применение функций над значениями полей таблицы
Функции можно применять не только над литералами, но и над значениями, взятыми из таблицы. При этом функция выполняет преобразования для каждой строки отдельно.
Например, давайте вернёмся к нашей базе данных и рассмотрим таблицу FamilyMembers: она содержит имя, статус и дату рождения людей.
Каждое значение этих полей мы можем изменить при выводе. Так нижележащий запрос высчитывает длину полного имени для каждого из членов семьи.
SELECT member_name, LENGTH(member_name) AS fullname_length FROM FamilyMembers;
Операции над результатом функции
Поскольку мы знаем, что каждая функция должна вернуть какой-либо из возможных литералов, то её результат также можно использовать в дальнейших расчётах и преобразованиях.
К примеру, мы хотим получить первые три буквы в строке и преобразовать их в заглавные. Для этого нам будет достаточно скомбинировать две функции: LEFT и UPPER, где результат одной функции будет аргументом для второй.
SELECT UPPER(LEFT('sql-academy', 3)) AS str;
Или хотим вычислить длину фамилии человека, имея строку в формате имя<пробел>фамилия. Одним из возможных способов вычисления длины фамилии может быть применение функций LENGTH и INSTR, используя формулу <длина фамилии> = <длина всей строки> - (<длина имени> + <длина пробела>):
- Значение <длина всей строки> можно получить с помощью функции LENGTH
- Для <длина имени> + <длина пробела> нужно вычислить позицию символа, где заканчивается имя, и прибавить единицу, т.к. пробел имеет длину «1». Мы можем сделать это используя лишь функцию INSTR, ориентируясь на символ «пробел»
Так как обе функции возвращают числовые литералы, мы можем выполнять арифметические операции над ними. Давайте вычтем одно из другого и получим длину фамилии (lastname_length):
SELECT member_name, LENGTH(member_name) AS full_length, INSTR(member_name, ' ') AS firstname_with_space_length, LENGTH(member_name) - INSTR(member_name, ' ') AS lastname_length FROM FamilyMembers;