Вычисляемые столбцы и функции для строк и чисел
Содержание курса
Как посчитать новый столбец в SELECT
Выражение в SELECT вычисляется для каждой строки. AS задаёт имя столбца в результате. Например, в SQLite:
WITH items(price, quantity) AS (VALUES (120, 2), (75, 3))
SELECT price, quantity, price * quantity AS total
FROM items
ORDER BY price DESC;Получатся строки 120 | 2 | 240 и 75 | 3 | 225. Столбец total существует в результате запроса; этот SELECT не добавляет его в исходную таблицу. Ниже — строковые функции и округление вычисленных значений.
До сих пор SELECT возвращал ровно те данные, которые лежат в таблице — столбец целиком, как есть. Сейчас посмотрим, что происходит, когда вместо имени столбца в SELECT стоит выражение: база данных вычислит его для каждой строки и вернёт уже готовый результат.
Арифметическое выражение в SELECT и псевдоним AS
Представьте таблицу order_items со столбцами product_id, price и quantity. Чтобы узнать сумму по каждой позиции, не нужно выгружать данные и считать вручную — достаточно написать выражение прямо в SELECT:
SELECT product_id, price * quantity FROM order_items;
СУБД пройдёт по каждой строке, перемножит price и quantity и добавит результат как отдельный столбец в итоговый набор. Строк будет ровно столько же, сколько в исходной таблице, — выражение применяется построчно.
Заголовок этого нового столбца окажется буквально price * quantity — строка из текста запроса. В небольшом скрипте это ещё терпимо, но в приложении, которое читает результат по имени столбца, или при выводе отчёта такой заголовок превращается в проблему.
Здесь в игру входит уже знакомое ключевое слово AS. Вы применяли его раньше для переименования обычных столбцов — для вычисляемых выражений оно работает абсолютно так же:
SELECT product_id, price * quantity AS сумма FROM order_items;
Теперь второй столбец в результате называется сумма. Ни синтаксис, ни порядок вычисления не меняются — AS только задаёт заголовок.
В SELECT можно использовать все стандартные арифметические операторы: +, -, *, /. Скобки тоже работают, если нужно управлять порядком операций:
SELECT product_id,
price * quantity AS сумма,
(price * quantity) * 0.1 AS налог
FROM order_items;
Оба вычисляемых столбца независимы: каждый — это отдельное выражение, которое база данных считает для каждой строки. Важно понимать, что между вычисляемыми столбцами одного SELECT нельзя ссылаться на псевдоним: написать price * quantity AS сумма, сумма * 0.1 AS налог не получится — SQLite увидит сумма как неизвестное имя столбца. Нужно повторить выражение целиком, как в примере выше.
