Применение функций

При составлении SQL запросов мы можем использовать встроенные функции. Например, если мы хотим вывести строку в верхнем регистре, то для этого мы можем использовать функцию UPPER.

MySQL
SELECT UPPER("Hello world") AS upper_string;
upper_string
HELLO WORLD

Что такое встроенная функция?

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

Каждая функция принимает набор аргументов определённого типа, выполняет заложенные в неё операции и обязательно возвращает один из возможных литералов. Стоит отметить, что функции могут принимать как ноль аргументов, так и несколько.

Например, функция NOW() принимает ноль аргументов и возвращает литерал в формате даты, а LENGTH('sql-academy') принимает один строковый аргумент и возвращает числовой литерал «11».

Примеры функций

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

Вот некоторые из них:

  • LOWER

    Возвращает строку, в которой все символы записаны в нижнем регистре

    MySQL
    SELECT LOWER('SQL Academy') AS lower_string;
    
    lower_string
    sql academy
  • YEAR

    Возвращает год для указанной даты

    MySQL
    SELECT YEAR("2022-06-16") AS year;
    
    year
    2022
  • INSTR

    Осуществляет поиск подстроки в строке, возвращая позицию её первого символа. При этом отсчёт начинается с единицы, а не нуля, как в большинстве языков программирования.

    Функция работает путём посимвольного сравнения исходной строки с искомой. Например, в строке sql-academy подстрока academy появляется, начиная с пятого символа.

    MySQL
    SELECT INSTR('sql-academy', 'academy') AS idx;
    
    idx
    5
  • LENGTH

    Возвращает длину указанной строки.

    MySQL
    SELECT LENGTH('sql-academy') AS str_length;
    
    str_length
    11

Применение функций над значениями полей таблицы

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

Например, давайте вернёмся к нашей базе данных и рассмотрим таблицу FamilyMembers: она содержит имя, статус и дату рождения людей.

Каждое значение этих полей мы можем изменить при выводе. Так нижележащий запрос высчитывает длину полного имени для каждого из членов семьи.

MySQL
SELECT member_name,
	LENGTH(member_name) AS fullname_length
FROM FamilyMembers;
member_namefullname_length
Headley Quincey15
Flavia Quincey14
Andie Quincey13
Lela Quincey12
Annie Quincey13
Ernest Forrest14
Constance Forrest17
Wednesday Addams16

Операции над результатом функции

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

К примеру, мы хотим получить первые три буквы в строке и преобразовать их в заглавные. Для этого нам будет достаточно скомбинировать две функции: LEFT и UPPER, где результат одной функции будет аргументом для второй.

MySQL
SELECT UPPER(LEFT('sql-academy', 3)) AS str;
str
SQL

Или хотим вычислить длину фамилии человека, имея строку в формате имя<пробел>фамилия. Одним из возможных способов вычисления длины фамилии может быть применение функций LENGTH и INSTR, используя формулу <длина фамилии> = <длина всей строки> - (<длина имени> + <длина пробела>):

  • Значение <длина всей строки> можно получить с помощью функции LENGTH
  • Для <длина имени> + <длина пробела> нужно вычислить позицию символа, где заканчивается имя, и прибавить единицу, т.к. пробел имеет длину «1». Мы можем сделать это используя лишь функцию INSTR, ориентируясь на символ «пробел»

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

MySQL
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;
member_namefull_lengthfirstname_with_space_lengthlastname_length
Headley Quincey1587
Flavia Quincey1477
Andie Quincey1367
Lela Quincey1257
Annie Quincey1367
Ernest Forrest1477
Constance Forrest17107
Wednesday Addams16106