Вычисляемые столбцы и функции для строк и чисел
Содержание курса
Числовые функции ROUND и ABS; неизменность исходной таблицы после SELECT
ROUND и ABS работают по той же схеме, что строковые функции: получают выражение и возвращают преобразованное число как вычисляемый столбец.
ABS(число) снимает знак: отрицательное значение становится положительным, положительное остаётся как есть. Удобно, когда в таблице хранятся балансы или разницы, которые могут уходить в минус, а нужна только величина:
SELECT id, ABS(balance) AS остаток FROM accounts;
ROUND(число, n) округляет до n знаков после запятой. Если n равен нулю или не указан, число округляется до целого, но тип результата в SQLite остаётся REAL — то есть ROUND(2.6) вернёт 3.0, а не 3. На практике это редко мешает, но стоит иметь в виду при сравнении результатов.
SELECT price,
ROUND(price * 1.13, 2) AS цена_с_ндс
FROM products;
Здесь сначала вычисляется price * 1.13, а затем результат округляется до двух знаков. Обе операции происходят в момент исполнения запроса — в строке таблицы ничего не записывается.
И вот это — ключевой момент всего урока. Любой SELECT, сколько бы функций и выражений в нём ни стояло, только читает данные. Чтобы убедиться в этом, достаточно выполнить два запроса подряд:
SELECT price, ROUND(price * 1.13, 2) AS цена_с_ндс FROM products;
SELECT * FROM products;
Второй запрос вернёт исходные значения price — ровно такие, какими они были до первого запроса. ROUND(price * 1.13, 2) существовал только в результирующем наборе первого SELECT, нигде больше.
Это фундаментальное свойство SELECT: он работает как линза — показывает данные в нужном виде, не трогая источник. Изменить значения в таблице могут только другие команды — не те, которые мы разбираем сейчас.
