У MS SQL Server есть несколько математических функций, которые позволят нам перенести на сервер максимальное количество логики и освободить клиентские компьютеры от лишних расчетов, а значит и нагрузки.
Иногда бывает необходимо определить значение числового поля, не обращая внимания на знак (абсолютное значение). Для этого используется функция ABS, которой в качестве параметра передается значение поля или переменной, а на выходе мы получаем то же число, но без знака.
В следующем примере объявляется целочисленная переменная, которой присваивается число -10. После выполнения ABS, на экране мы увидим число 10, а знак будет отброшен:
DECLARE @num int SET @num=-10 SELECT ABS(@num)
Следующий пример отображает название товара и абсолютное значение количества, ведь количество товара не может быть отрицательным (хотя, в некоторых задачах бывают и исключения):
SELECT [Название товара], ABS(Количество) FROM Товары
Для определения знака можно использовать функцию SIGN. В качестве параметра этой функции нужно передать число, а в качестве результата мы получаем:
Следующий запрос вернет нам значение -1:
SELECT SIGN(-12)
Функция 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.
К функциям сложной математики я отнес логарифмы, экспоненту, потому что для их расчета нужно немалое процессорное время и перенести эти расчеты на сервер будет неплохим решением.
Функция EXP возвращает экспоненту указанного в качестве параметра числа:
DECLARE @angle float SET @angle = 90 SELECT EXP(@angle)
Для определения логарифма указанного числа используется функция LOG:
DECLARE @angle float SET @angle = 5.3 SELECT LOG(@angle)
Для генерации случайного значения используется функция RAND. В качестве параметра передается переменная, которая определяет начальное значение или источник. Например:
DECLARE @r int SET @r=20000000 SELECT RAND(@r)
Попробуйте выполнить этот запрос несколько раз, и вы увидите в результате одно и то же значение. Это серьезный недостаток. Для одного и того же значения переменной, указанного в качестве параметра, будет одно и то же случайное число. Получается, что результат RAND нельзя назвать случайным.
Честно сказать, я не очень дружу с тригонометрией. Нет, с математикой в школе все было отлично, но после этого прошло очень много времени и многое позабылось, поэтому приходиться потратить много времени, чтобы восстановить всю необходимую информацию в памяти. А это необходимо, когда приходиться работать с графикой.
Тригонометрические функции слишком схожи, поэтому будем рассматривать их все оптом, так дешевле :).
Для определения арккосинуса используется функция 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)
Для работы со степенями есть только две функции SQRT – квадратный корень и SQUARE – возведение числа в квадрат. Следующий пример показывает, как можно определить квадратный корень числа 4:
SELECT SQRT(4)
В результате мы увидим число 2. Следующий пример считает квадрат числа 6:
SELECT SQUARE(6)
В результате мы увидим число 36.