2020-10-26 10:29:30 +00:00
---
2022-08-26 17:37:11 +00:00
slug: /ru/sql-reference/functions/arithmetic-functions
2022-04-09 13:29:05 +00:00
sidebar_position: 34
sidebar_label: "Арифметические функции"
2020-10-26 10:29:30 +00:00
---
2020-03-20 18:20:59 +00:00
# Арифметические функции {#arifmeticheskie-funktsii}
2017-03-12 17:58:51 +00:00
2020-03-20 18:20:59 +00:00
Для всех арифметических функций, тип результата вычисляется, как минимальный числовой тип, который может вместить результат, если такой тип есть. Минимум берётся одновременно по числу бит, знаковости и «плавучести». Если бит не хватает, то берётся тип максимальной битности.
2017-03-12 17:58:51 +00:00
Пример:
2020-03-20 18:20:59 +00:00
``` sql
2017-10-25 05:27:09 +00:00
SELECT toTypeName(0), toTypeName(0 + 0), toTypeName(0 + 0 + 0), toTypeName(0 + 0 + 0 + 0)
```
2017-03-12 17:58:51 +00:00
2020-03-20 18:20:59 +00:00
``` text
2017-10-25 05:27:09 +00:00
┌─toTypeName(0)─┬─toTypeName(plus(0, 0))─┬─toTypeName(plus(plus(0, 0), 0))─┬─toTypeName(plus(plus(plus(0, 0), 0), 0))─┐
│ UInt8 │ UInt16 │ UInt32 │ UInt64 │
└───────────────┴────────────────────────┴─────────────────────────────────┴──────────────────────────────────────────┘
```
2017-06-13 04:15:47 +00:00
2017-03-12 17:58:51 +00:00
Арифметические функции работают для любой пары типов из UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64, Float32, Float64.
Переполнение производится также, как в C++.
2020-03-20 18:20:59 +00:00
## plus(a, b), оператор a + b {#plusa-b-operator-a-b}
2017-10-25 05:27:09 +00:00
2017-03-12 17:58:51 +00:00
Вычисляет сумму чисел.
Также можно складывать целые числа с датой и датой-с -временем. В случае даты, прибавление целого числа означает прибавление соответствующего количества дней. В случае даты-с -временем - прибавление соответствующего количества секунд.
2020-03-20 18:20:59 +00:00
## minus(a, b), оператор a - b {#minusa-b-operator-a-b}
2017-10-25 05:27:09 +00:00
2017-03-12 17:58:51 +00:00
Вычисляет разность чисел. Результат всегда имеет знаковый тип.
Также можно вычитать целые числа из даты и даты-с -временем. Смысл аналогичен - смотрите выше для plus.
2020-03-20 18:20:59 +00:00
## multiply(a, b), оператор a \* b {#multiplya-b-operator-a-b}
2017-10-25 05:27:09 +00:00
2017-03-12 17:58:51 +00:00
Вычисляет произведение чисел.
2020-03-20 18:20:59 +00:00
## divide(a, b), оператор a / b {#dividea-b-operator-a-b}
2017-10-25 05:27:09 +00:00
2017-03-12 17:58:51 +00:00
Вычисляет частное чисел. Тип результата всегда является типом с плавающей запятой.
Т о есть, деление не целочисленное. Для целочисленного деления, используйте функцию intDiv.
При делении на ноль получится inf, -inf или nan.
2020-03-20 18:20:59 +00:00
## intDiv(a, b) {#intdiva-b}
2017-10-25 05:27:09 +00:00
2017-03-12 17:58:51 +00:00
Вычисляет частное чисел. Деление целочисленное, с округлением вниз (по абсолютному значению).
При делении на ноль или при делении минимального отрицательного числа на минус единицу, кидается исключение.
2020-03-20 18:20:59 +00:00
## intDivOrZero(a, b) {#intdivorzeroa-b}
2017-10-25 05:27:09 +00:00
2017-03-12 17:58:51 +00:00
Отличается от intDiv тем, что при делении на ноль или при делении минимального отрицательного числа на минус единицу, возвращается ноль.
2020-05-19 06:02:30 +00:00
## modulo(a, b), оператор a % b {#modulo}
2017-10-25 05:27:09 +00:00
2017-03-12 17:58:51 +00:00
Вычисляет остаток от деления.
2022-08-11 09:25:33 +00:00
Тип результата - целое число, если о б а аргумента - целые числа. Если один из аргументов является числом с плавающей точкой, результатом будет число с плавающей точкой.
2017-03-12 17:58:51 +00:00
Берётся остаток в том же смысле, как это делается в C++. По факту, для отрицательных чисел, используется truncated division.
При делении на ноль или при делении минимального отрицательного числа на минус единицу, кидается исключение.
2020-05-19 06:02:30 +00:00
## moduloOrZero(a, b) {#modulo-or-zero}
В отличие от [modulo ](#modulo ), возвращает ноль при делении на ноль.
2020-03-20 18:20:59 +00:00
## negate(a), оператор -a {#negatea-operator-a}
2017-10-25 05:27:09 +00:00
2017-03-12 17:58:51 +00:00
Вычисляет число, обратное по знаку. Результат всегда имеет знаковый тип.
2020-03-22 09:14:59 +00:00
## abs(a) {#arithm_func-abs}
2017-10-25 05:27:09 +00:00
2020-03-20 18:20:59 +00:00
Вычисляет абсолютное значение для числа a. Т о есть, если a \< 0, то возвращает -a.
2017-03-12 17:58:51 +00:00
Для беззнаковых типов ничего не делает. Для чисел типа целых с о знаком, возвращает число беззнакового типа.
2017-11-23 08:46:51 +00:00
2020-03-20 18:20:59 +00:00
## gcd(a, b) {#gcda-b}
2017-11-23 08:46:51 +00:00
Вычисляет наибольший общий делитель чисел.
При делении на ноль или при делении минимального отрицательного числа на минус единицу, кидается исключение.
2020-03-20 18:20:59 +00:00
## lcm(a, b) {#lcma-b}
2017-11-23 08:46:51 +00:00
Вычисляет наименьшее общее кратное чисел.
При делении на ноль или при делении минимального отрицательного числа на минус единицу, кидается исключение.
2018-10-16 10:47:17 +00:00
2021-10-22 14:57:55 +00:00
## max2 {#max2}
2021-10-24 08:10:00 +00:00
Сравнивает два числа и возвращает максимум. Возвращаемое значение приводится к типу [Float64 ](../../sql-reference/data-types/float.md ).
2021-10-22 14:57:55 +00:00
**Синтаксис**
```sql
max2(value1, value2)
```
**Аргументы**
- `value1` — первое число. [Int/UInt ](../../sql-reference/data-types/int-uint.md ) или [Float ](../../sql-reference/data-types/float.md ).
- `value2` — второе число. [Int/UInt ](../../sql-reference/data-types/int-uint.md ) или [Float ](../../sql-reference/data-types/float.md ).
**Возвращаемое значение**
- Максимальное значение среди двух чисел.
Тип: [Float ](../../sql-reference/data-types/float.md ).
**Пример**
Запрос:
```sql
SELECT max2(-1, 2);
```
Результат:
```text
┌─max2(-1, 2)─┐
│ 2 │
└─────────────┘
```
## min2 {#min2}
2021-10-24 08:10:00 +00:00
Сравнивает два числа и возвращает минимум. Возвращаемое значение приводится к типу [Float64 ](../../sql-reference/data-types/float.md ).
2021-10-22 14:57:55 +00:00
**Синтаксис**
```sql
min2(value1, value2)
```
**Аргументы**
- `value1` — первое число. [Int/UInt ](../../sql-reference/data-types/int-uint.md ) или [Float ](../../sql-reference/data-types/float.md ).
- `value2` — второе число. [Int/UInt ](../../sql-reference/data-types/int-uint.md ) или [Float ](../../sql-reference/data-types/float.md ).
**Возвращаемое значение**
- Минимальное значение среди двух чисел.
Тип: [Float ](../../sql-reference/data-types/float.md ).
**Пример**
Запрос:
```sql
SELECT min2(-1, 2);
```
Результат:
```text
┌─min2(-1, 2)─┐
│ -1 │
└─────────────┘
```
2022-10-19 10:55:24 +00:00
## multiplyDecimal(a, b[, result_scale])
2022-11-23 22:23:59 +00:00
Совершает умножение двух Decimal. Результат будет иметь тип [Decimal256 ](../../sql-reference/data-types/decimal.md ).
2022-10-19 10:55:24 +00:00
Scale (размер дробной части) результат можно явно задать аргументом `result_scale` (целочисленная константа из интервала `[0, 76]` ).
2022-11-23 22:23:59 +00:00
Если этот аргумент не задан, то scale результата будет равен наибольшему из scale обоих аргументов.
2022-10-19 10:55:24 +00:00
**Синтаксис**
```sql
multiplyDecimal(a, b[, result_scale])
2022-11-23 22:23:59 +00:00
```
:::note
2024-02-13 01:10:41 +00:00
Эта функция работает гораздо медленнее обычной `multiply` .
2022-11-23 22:23:59 +00:00
В случае, если нет необходимости иметь фиксированную точность и/или нужны быстрые вычисления, следует использовать [multiply ](#multiply ).
:::
**Аргументы**
- `a` — Первый сомножитель/делимое: [Decimal ](../../sql-reference/data-types/decimal.md ).
- `b` — Второй сомножитель/делитель: [Decimal ](../../sql-reference/data-types/decimal.md ).
- `result_scale` — Scale результата: [Int/UInt ](../../sql-reference/data-types/int-uint.md ).
**Возвращаемое значение**
- Результат умножения с заданным scale.
Тип: [Decimal256 ](../../sql-reference/data-types/decimal.md ).
**Примеры**
```sql
SELECT multiplyDecimal(toDecimal256(-12, 0), toDecimal32(-2.1, 1), 1);
```
```text
┌─multiplyDecimal(toDecimal256(-12, 0), toDecimal32(-2.1, 1), 1)─┐
│ 25.2 │
└────────────────────────────────────────────────────────────────┘
```
**Отличие от стандартных функций**
```sql
SELECT toDecimal64(-12.647, 3) * toDecimal32(2.1239, 4);
SELECT toDecimal64(-12.647, 3) as a, toDecimal32(2.1239, 4) as b, multiplyDecimal(a, b);
```
```text
┌─multiply(toDecimal64(-12.647, 3), toDecimal32(2.1239, 4))─┐
│ -26.8609633 │
└───────────────────────────────────────────────────────────┘
┌─multiplyDecimal(toDecimal64(-12.647, 3), toDecimal32(2.1239, 4))─┐
│ -26.8609 │
└──────────────────────────────────────────────────────────────────┘
```
```sql
SELECT
toDecimal64(-12.647987876, 9) AS a,
toDecimal64(123.967645643, 9) AS b,
multiplyDecimal(a, b);
SELECT
toDecimal64(-12.647987876, 9) AS a,
toDecimal64(123.967645643, 9) AS b,
a * b;
```
```text
┌─────────────a─┬─────────────b─┬─multiplyDecimal(toDecimal64(-12.647987876, 9), toDecimal64(123.967645643, 9))─┐
│ -12.647987876 │ 123.967645643 │ -1567.941279108 │
└───────────────┴───────────────┴───────────────────────────────────────────────────────────────────────────────┘
Received exception from server (version 22.11.1):
Code: 407. DB::Exception: Received from localhost:9000. DB::Exception: Decimal math overflow: While processing toDecimal64(-12.647987876, 9) AS a, toDecimal64(123.967645643, 9) AS b, a * b. (DECIMAL_OVERFLOW)
```
## divideDecimal(a, b[, result_scale])
Совершает деление двух Decimal. Результат будет иметь тип [Decimal256 ](../../sql-reference/data-types/decimal.md ).
Scale (размер дробной части) результат можно явно задать аргументом `result_scale` (целочисленная константа из интервала `[0, 76]` ).
Если этот аргумент не задан, то scale результата будет равен наибольшему из scale обоих аргументов.
**Синтаксис**
```sql
2022-10-19 10:55:24 +00:00
divideDecimal(a, b[, result_scale])
```
2022-11-01 13:40:26 +00:00
:::note
2022-11-23 22:23:59 +00:00
Эта функция работает гораздо медленнее обычной `divide` .
В случае, если нет необходимости иметь фиксированную точность и/или нужны быстрые вычисления, следует использовать [divide ](#divide ).
2022-11-01 13:40:26 +00:00
:::
2022-10-19 10:55:24 +00:00
**Аргументы**
- `a` — Первый сомножитель/делимое: [Decimal ](../../sql-reference/data-types/decimal.md ).
- `b` — Второй сомножитель/делитель: [Decimal ](../../sql-reference/data-types/decimal.md ).
- `result_scale` — Scale результата: [Int/UInt ](../../sql-reference/data-types/int-uint.md ).
**Возвращаемое значение**
2022-11-23 22:23:59 +00:00
- Результат деления с заданным scale.
2022-10-19 10:55:24 +00:00
Тип: [Decimal256 ](../../sql-reference/data-types/decimal.md ).
2022-11-22 14:30:44 +00:00
**Примеры**
2022-10-19 10:55:24 +00:00
```sql
SELECT divideDecimal(toDecimal256(-12, 0), toDecimal32(2.1, 1), 10);
```
```text
┌─divideDecimal(toDecimal256(-12, 0), toDecimal32(2.1, 1), 10)─┐
│ -5.7142857142 │
└──────────────────────────────────────────────────────────────┘
```
2022-11-22 14:30:44 +00:00
**Отличие от стандартных функций**
```sql
SELECT toDecimal64(-12, 1) / toDecimal32(2.1, 1);
SELECT toDecimal64(-12, 1) as a, toDecimal32(2.1, 1) as b, divideDecimal(a, b, 1), divideDecimal(a, b, 5);
```
```text
┌─divide(toDecimal64(-12, 1), toDecimal32(2.1, 1))─┐
│ -5.7 │
└──────────────────────────────────────────────────┘
┌───a─┬───b─┬─divideDecimal(toDecimal64(-12, 1), toDecimal32(2.1, 1), 1)─┬─divideDecimal(toDecimal64(-12, 1), toDecimal32(2.1, 1), 5)─┐
│ -12 │ 2.1 │ -5.7 │ -5.71428 │
└─────┴─────┴────────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────────┘
```
```sql
SELECT toDecimal64(-12, 0) / toDecimal32(2.1, 1);
SELECT toDecimal64(-12, 0) as a, toDecimal32(2.1, 1) as b, divideDecimal(a, b, 1), divideDecimal(a, b, 5);
```
```text
DB::Exception: Decimal result's scale is less than argument's one: While processing toDecimal64(-12, 0) / toDecimal32(2.1, 1). (ARGUMENT_OUT_OF_BOUND)
┌───a─┬───b─┬─divideDecimal(toDecimal64(-12, 0), toDecimal32(2.1, 1), 1)─┬─divideDecimal(toDecimal64(-12, 0), toDecimal32(2.1, 1), 5)─┐
│ -12 │ 2.1 │ -5.7 │ -5.71428 │
└─────┴─────┴────────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────────┘
```