2.26. Математические функции

У MS SQL Server есть несколько математических функций, которые позволят нам перенести на сервер максимальное количество логики и освободить клиентские компьютеры от лишних расчетов, а значит и нагрузки.

2.26.1. Знаки

Иногда бывает необходимо определить значение числового поля, не обращая внимания на знак (абсолютное значение). Для этого используется функция ABS, которой в качестве параметра передается значение поля или переменной, а на выходе мы получаем то же число, но без знака.

В следующем примере объявляется целочисленная переменная, которой присваивается число -10. После выполнения ABS, на экране мы увидим число 10, а знак будет отброшен:

DECLARE @num int
SET @num=-10
SELECT ABS(@num)

Следующий пример отображает название товара и абсолютное значение количества, ведь количество товара не может быть отрицательным (хотя, в некоторых задачах бывают и исключения):

SELECT [Название товара], ABS(Количество)
FROM Товары

Для определения знака можно использовать функцию SIGN. В качестве параметра этой функции нужно передать число, а в качестве результата мы получаем:

  • -1 если число отрицательное;
  • 0 если число равно нулю;
  • 1 если положительное.

Следующий запрос вернет нам значение -1:

SELECT SIGN(-12)

2.26.2. Округление

Функция CEILING возвращает ближайшее целое число, которое является больше, указанного в качестве параметра. Другими словами, происходит округление в большую сторону. Например, если в качестве параметра передать число 1.3, то ближайшее целое число, которое будет больше указанного, это 2. Следующий пример демонстрирует это в виде SQL запроса:

DECLARE @num float
SET @num = 1.3
SELECT CEILING(@num)

Если передать отрицательное число, например, -12.5, то будет возвращено число 12, которое больше, и при этом ближайшее.

Давайте посмотрим, как можно округлить цены в таблице товаров до ближайшего целого:

SELECT [Название товара], CEILING(Цена), ABS(Количество)
FROM Товары

Если в качестве параметра передать целое число, то функция вернет его, потому что оно уже является целым.

Обратную задачу выполняет функция FLOOR, которая округляет дробное число до ближайшего меньшего числа. Например:

DECLARE @num float
SET @num = 1.3
SELECT FLOOR(@num)

В этом примере мы округляем число 1.3 до ближайшего меньшего, поэтому результатом будет 1.

Для отрицательного числа -4.6 ближайшим будет -5.

Для округления дробного числа до ближайшего целого (не имеет значения, в какую сторону) используется функция ROUND. У нее два параметра: дробное число, которое нужно округлить, и целое число, определяющее, до какого разряда необходимо округлить.

Давайте рассмотрим несколько примеров округления на примере числа 262.1537. Для начала округлим до целого числа, для этого второй параметр должен быть равен нулю:

SELECT ROUND(262.1537, 0)

В результате мы увидим число 262.0000.

Если необходимо оставить после запятой один символ, то в качестве второго параметра нужно указать число 1. «Запятая», это по российским правилам, а SQL сервер работает по американским стандартам и тут дробную часть отделяет точка. Итак, следующим пример оставляет один разряд после запятой:

SELECT ROUND(262.1537, 1)

В результате мы получаем число 262.2000.

Можно округлять и до любого разряда до запятой, для этого можно во втором параметре указать отрицательное значение. Если необходимо округлить до одного разряда до запятой, то в качестве второго параметра указываем число -1:

SELECT ROUND(262.1537, -1)

Результатом будет 260.0000.

2.26.3. Сложная математика

К функциям сложной математики я отнес логарифмы, экспоненту, потому что для их расчета нужно немалое процессорное время и перенести эти расчеты на сервер будет неплохим решением.

Функция EXP возвращает экспоненту указанного в качестве параметра числа:

DECLARE @angle float
SET @angle = 90
SELECT EXP(@angle)

Для определения логарифма указанного числа используется функция LOG:

DECLARE @angle float
SET @angle = 5.3
SELECT LOG(@angle)

2.26.4. Случайное значение

Для генерации случайного значения используется функция RAND. В качестве параметра передается переменная, которая определяет начальное значение или источник. Например:

DECLARE @r int 
SET @r=20000000
SELECT RAND(@r)

Попробуйте выполнить этот запрос несколько раз, и вы увидите в результате одно и то же значение. Это серьезный недостаток. Для одного и того же значения переменной, указанного в качестве параметра, будет одно и то же случайное число. Получается, что результат RAND нельзя назвать случайным.

2.26.5. Тригонометрические функции

Честно сказать, я не очень дружу с тригонометрией. Нет, с математикой в школе все было отлично, но после этого прошло очень много времени и многое позабылось, поэтому приходиться потратить много времени, чтобы восстановить всю необходимую информацию в памяти. А это необходимо, когда приходиться работать с графикой.

Тригонометрические функции слишком схожи, поэтому будем рассматривать их все оптом, так дешевле :).

Для определения арккосинуса используется функция ACOS, которой необходимо передать дробное число от -1 до 1, которое определяет необходимый угол:

DECLARE @angle float
SET @angle = -1
SELECT ACOS(@angle)

В результате мы увидим арккосинус угла -1, который равен 3.1415926535897931. Ничего вам это не напоминает? Если вспомнить математику, то это число должно напомнить вам константу Пи.

Для получения числа Пи можно воспользоваться и более простым методом – вызвать функцию PI:

SELECT PI()

Функция ASIN возвращает арксинус указанного угла. Угол также задается в диапазоне от -1 до 1.

DECLARE @angle float
SET @angle = -1
SELECT ASIN(@angle)

Функция ATAN возвращает арктангенс:

DECLARE @angle float
SET @angle = -1
SELECT ATAN(@angle)

Функция COS возвращает косинус:

DECLARE @angle float
SET @angle = 90
SELECT COS(@angle)

Для определения синуса используем функцию SIN:

DECLARE @angle float
SET @angle = 90
SELECT SIN(@angle)

Для определения тангенса используется функция TAN:

DECLARE @angle float
SET @angle = 90
SELECT TAN(@angle)

2.26.6. Степень

Для работы со степенями есть только две функции SQRT – квадратный корень и SQUARE – возведение числа в квадрат. Следующий пример показывает, как можно определить квадратный корень числа 4:

SELECT SQRT(4)

В результате мы увидим число 2. Следующий пример считает квадрат числа 6:

SELECT SQUARE(6)

В результате мы увидим число 36.

Следующая глава

2.27. Многие ко многим

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне