Базовый курс SQL. Вычисляемые поля

Forums:

[к оглавлению]

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

  • Соединить ФИО, хранящиеся в разных столбцах
  • Вычислить стоимость покупки на основе цены товара и количества
  • Скомбинировать строку адреса
  • Сумма, среднее значение и тп.

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

Вычисляемые поля - это "виртуальные" поля (столбцы) таблицы, не существующие в БД, а создаваемые для нужд пользователя в процессе запроса оператором SELECT.

Конкатенация полей

Конкатенация - "склеивание" нескольких строк в одну.

Допустим, мы создаём список студентов участвующих в творческом конкурсе, и нам требуется указать их возраст в виде Фамилия (возраст). В PostgreSQL соединить значения двух столбцов и добавить скобки мы можем с помощью оператора ||:

SELECT student_surname || ' (' || student_age || ')'
FROM Students
ORDER BY student_surname;

Получим:

------------------------------------
Адамченко          (21                )
Грошев             (20                )
Егорова            (19                )
Колобков           (22                )
Легран             (24                )
Петрашевский       (22                )
Распопов           (22                )
Римский            (21                )
Сейдинай           (25                )
Шульгина           (23                )

Как вы можете увидеть, в результате мы имеем все 4 части, склеенные в одну строку. Но мешают пробелы, которыми было заполнено поле. Чтобы их убрать, воспользуемся функцией RTRIM(), которая удаляет все пробелы, справа от значения. Также, в случае необходимости, можете использовать LTRIM() и TRIM(), удаляющие соответственно пробелы слева от строки или пробелы и слева, и справа.

SELECT RTRIM(student_surname) || ' (' || RTRIM(student_age) || ')'
FROM Students
ORDER BY student_surname;


------------------------------------
Адамченко (21)
Грошев (20)
Егорова (19)
Колобков (22)
Легран (24)
Петрашевский (22)
Распопов (22)
Римский (21)
Сейдинай (25)
Шульгина (23)

В некоторых других СУБД для конкатенации вместо "||" используется "+".
В MySQL конкатенацию можно осуществить с помощью функции CONCAT().

Псевдонимы вычисляемых полей

Наверное вы заметили, что новый столбец, который мы получили "на лету", не имеет имени. В таком случае мы не сможем обратиться к нему на стороне клиентского приложения. Чтобы решить эту проблему, дадим столбцу псевдоним. Для этого используется ключевое слово AS:

SELECT RTRIM(student_surname) || ' (' || RTRIM(student_age) || ')'
              AS student_data
FROM Students
ORDER BY student_surname;

Получим:

student_data
------------------------------------
Адамченко (21)
Грошев (20)
Егорова (19)
Колобков (22)
Легран (24)
Петрашевский (22)
Распопов (22)
Римский (21)
Сейдинай (25)
Шульгина (23)

Теперь мы сможем обращаться к результату данного запроса по имени, так, как если бы это был реальный столбец.

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

Математические операции

Теперь нам нужно определить победителей конкурса. Для этого сложим результаты двух туров и отсортируем список по убыванию:

SELECT student_id, 
    first_round_points, 
    second_round_points, 
    first_round_points + second_round_points AS final_points
FROM Participants
ORDER BY final_points DESC;

Получим практически готовую турнирную таблицу:

student_id  |  first_round_points  |  second_round_points  |  final_points
-------------------------------------------------------------------------------
92540 	  |        148  	|        115    	|  263
92522 	  |        95       |        124      	|  219
92518 	  |        103  	|        59     	|  162
92435 	  |        65     	|        89     	|  154
92526 	  |        13       |        36       	|  49

В данном случае столбец final_points является вычисляемым полем. В SQL на ряду со сложением (+) могут быть использованы вычитание (-), умножение (*) и деление (/). Для управления порядком вычислений используйте скобки.

Есть и другие способы расчёта суммы значений в SQL, например, с помощью функции SUM().
Подробнее функции мы рассмотрим в следующем разделе.

Следующая страница. Функции() для обработки данных.
Оглавление.