Файлы к уроку:
Математические операторы
Ниже перечислены математические операторы PostgreSQL. Некоторые математические операторы являются стандартными и присутствуют в любой СУБД. Некоторых операторов может не быть в других СУБД или их синтаксис может отличаться.
Оператор | Описание |
---|---|
+ | Сложение |
— | Вычитание |
* | Умножение |
/ | Деление |
% | Остаток от деления |
^ | Возведение в степень |
|/ | Квадратный корень |
||/ | Кубический корень |
factorial(x) | Факториал |
Математика и типы данных
Если выполняется математическая операция между двумя числами с использованием операторов, то ожидайте, что тип данных итогового результат будет следующим:
- Два integer вернут integer
- Если присутствует хотя бы 1 numeric, то вернется numeric
- Если присутствует хотя бы 1 floating, то вернется floating
- Возведение в степень, корень, факториал возвращают numeric или floating
Если вас не устраивает тип данных значений, которые получились в результате, то вы всегда можете воспользоваться функцией CAST.
Чтобы узнать типы данных столбцов таблицы можно воспользоваться запросом:
select
column_name,
data_type
from information_schema.columns
where table_name = 'bike_sales';
Если нужно узнать тип данных одного столбца, то можно воспользоваться функцией pg_typeof:
select
pg_typeof(order_date)
from bike_sales
Практика
-- Сложение, вычитание, умножение, деление
select
5 + 5,
pg_typeof(5 + 5);
select
4 / 3,
pg_typeof(4 / 3);
select
4.0 / 3.0,
pg_typeof(4.0 / 3.0);
select
4.0 / 3,
pg_typeof(4.0 / 3);
select
5 - 2.5,
pg_typeof(5 * 2.5);
select
5 * 3.14,
pg_typeof(5 * 3.14);
select
3.14 / 18,
pg_typeof(3.14 / 18);
-- Остаток от деления
select
12 % 7,
pg_typeof(12 % 7);
-- Возведение в степень
select
3 ^ 4,
pg_typeof(3 ^ 4);
-- Квадратный корень
select
|/ 16,
pg_typeof(|/ 16);
select
sqrt(16),
pg_typeof(sqrt(16));
-- Корень третьей степени
select
||/ 27,
pg_typeof(||/ 27);
-- Факториал = 1 * 2 * 3 * 4
select
factorial(4),
pg_typeof(factorial(4));
Порядок выполнения математических операций
- Возведение в степень и корень
- Умножение, деление и остаток от деления
- Сложение и вычитание
select
-- =-3
5 - 1 * 8,
-- =32
(5 - 1) * 8;
select
-- =23
4 ^ 2 + 7,
-- =262'144
4 ^ (2 + 7);
Практика на таблице bike_sales
-- Добавить столбец margin
select
*,
profit / revenue as margin
from bikes.bike_sales
-- Добавить столбец profit_per_unit
select
*,
profit / order_quantity as profit_per_unit
from bikes.bike_sales
-- Добавить столбец profit_after_tax
select
*,
profit * 0.85 as profit_after_tax
from bikes.bike_sales
Найти декаду для каждого года, посчитать количество строк в каждой декаде
Для этого упражнения воспользуемся таблицей kinopoisk. Сначала создадим эту таблицу и импортируем данные в базу.
-- Создать таблицу
create table kinopoisk (
rating smallint,
movie text,
year smallint,
country text,
rating_balls numeric(4, 3),
overview text,
director text,
screenwriter text,
actors text,
url_logo text
);
-- Импорт данных в таблицу
copy kinopoisk
from 'c:\Users\user\Desktop\sql_training\kp.csv'
with (format CSV,
header,
delimiter ';',
encoding 'WIN1251');
Чтобы найти декаду для каждого года можно из года вычесть остаток от деления года на 10.
-- Получить декаду для года
select
year as release_year,
year - year % 10 as release_decade_mod
from kinopoisk
Посчитаем количество фильмов в каждой декаде:
-- Посчитать сколько фильмов каждой декады находится в топе
select
year - year % 10 as release_decade_mod,
count(*) as films_cnt
from kinopoisk
group by
year - year % 10 as release_decade_mod
order by
release_decade_rnd