Вычисления в запросах
Запрос может показывать не только то, что хранится в таблице. После SELECT можно написать вычисление, и база данных выполнит его для каждой строки. Сколько стоили бы игры на распродаже со скидкой $5 на каждую?
SELECT title, price, price - 5
FROM games;| title | price | price - 5 |
|---|---|---|
| Dragon Forge | 40 | 35 |
| Pixel Racer | 15 | 10 |
| Moon Farm | 20 | 15 |
| … | … | … |
Можно складывать (+), вычитать (-), умножать (*) и делить (/). В вычислении можно использовать столбец и число, как здесь, или несколько столбцов: в order_items выражение quantity * price — это сумма, которую клиент заплатил за все экземпляры игры. Как и в математике, * и / выполняются раньше + и -, а ещё можно пользоваться скобками: price + 5 * 2 прибавляет к цене 10, а (price + 5) * 2 прибавляет 5 и удваивает результат. SQLite умеет считать даже без таблицы: SELECT 7 * 6; покажет 42.
Вычисляемого столбца нет в таблице, поэтому у него нет собственного названия. В результате он называется по вычислению, точно так, как вы его набрали: price - 5. Если написать price-5 без пробелов, столбец будет называться price-5. В следующем упражнении вы научитесь давать ему название получше.
Вычисление меняет только то, что показывает запрос. Таблица остаётся прежней: после этого запроса игры стоят столько же, сколько стоили до него. (Как изменять данные в таблице, вы узнаете позже в этом курсе.)
Числа с десятичной точкой тоже работают: price * 0.8 — это цена после скидки 20%. Результат тогда будет десятичным числом, и SQLite покажет его как 32.0, даже если оно целое. Но будьте осторожны с делением: когда оба числа целые, результат тоже целый, поэтому 25 / 2 даёт 12, а не 12.5. Почему так и что с этим делать, вы узнаете на уроке о функциях.
Типичная ошибка — умножение через x. В SQL, как и в большинстве языков программирования, знак умножения — звёздочка: price * 2. Запрос SELECT title, price x 2 FROM games; заканчивается ошибкой near "2": syntax error, потому что SQLite читает x как новое имя для столбца price, как и в случае с пропущенной запятой на первом уроке.
Задание
- 1
Покажите номер заказа, номер игры, количество и цену каждой позиции в
order_items, а в последнем столбце — сумму, которую клиент заплатил за все её экземпляры: количество, умноженное на цену. Отсортируйте позиции по количеству, от самого большого, а позиции с одинаковым количеством — по номеру заказа. Первые строки — это позиции с двумя экземплярами. (Последний столбец называется по вычислению так, как вы его набрали, поэтому его название может отличаться.)order_id game_id quantity price quantity * price 6 2 2 15 30 15 11 2 25 50 22 14 2 30 60 … … … … … - 2
Ниже покажите номер игры, номер клиента и оценку каждого отзыва, а в последнем столбце — оценку по шкале из 100 баллов: оценка, умноженная на 20. Отсортируйте отзывы по номеру игры, а отзывы об одной игре — по номеру клиента:
game_id customer_id stars stars * 20 1 1 4 80 1 2 5 100 1 5 3 60 … … … …