SQRT: примеры (SQL)
SQRT(float_expression): floatФункция SQRT в MS SQL Server
Функция SQRT является встроенной математической функцией в Microsoft SQL Server, предназначенной для вычисления квадратного корня из указанного числового значения. Она находит применение в статистических расчетах, анализе данных, геометрических вычислениях (например, расстояние между точками), финансовом моделировании и других областях, где требуется извлечение корня.
Синтаксис функции предельно прост: SQRT ( float_expression ).
- float_expression: Единственный аргумент функции. Это выражение типа float или типа, который может быть неявно преобразован в float. Это значение, из которого требуется извлечь квадратный корень.
Возвращаемое значение:
- Функция возвращает результат типа float.
- Если аргумент имеет значение NULL, функция возвращает NULL.
- Если аргумент является отрицательным числом, функция возвращает NULL и регистрирует ошибку домена.
Примеры использования SQRT
Базовый пример вычисления квадратного корня:
SELECT SQRT(25) AS Result;Result 5.0
Использование с десятичным числом:
SELECT SQRT(30.25) AS Result;Result 5.5
Передача выражения в качестве аргумента:
SELECT SQRT(4 * 9) AS Result;Result 6.0
Реакция на отрицательное значение:
SELECT SQRT(-9) AS Result;Result NULL
Работа со значением NULL:
SELECT SQRT(NULL) AS Result;Result NULL
Похожие функции в MS SQL Server
- POWER: Функция для возведения числа в степень. POWER(x, 0.5) эквивалентно SQRT(x). POWER является более универсальной, так как позволяет вычислять любую степень, а не только квадратный корень.
- SQUARE: Функция для возведения числа в квадрат. Она является обратной операцией к извлечению квадратного корня. SQUARE(SQRT(x)) вернет исходное число (для x >= 0).
- LOG и EXP: Квадратный корень можно вычислить через натуральный логарифм и экспоненту: EXP(LOG(x)/2). Этот способ сложнее и обычно менее производителен, но может быть полезен в образовательных целях или в отсутствие прямой функции.
Предпочтения: SQRT следует использовать для прямой цели – извлечения квадратного корня, так как это наиболее читабельный и, как правило, оптимальный по производительности вариант. POWER применяют для вычисления произвольных степеней.
Типичные ошибки при работе с SQRT
1. Передача нечислового аргумента. Функция ожидает тип, приводимый к float.
SELECT SQRT('текст') AS Result;Сообщение об ошибке: Ошибка преобразования значения varchar 'текст' в тип данных float.
2. Неучет того, что функция возвращает NULL для отрицательных чисел. Это может привести к неожиданным NULL в последующих вычислениях.
SELECT 10 / SQRT(-4) AS Result; -- Деление на NULLResult NULL
3. Потеря точности при неявном преобразовании целых чисел. Хотя это редко является проблемой для SQRT, стоит помнить, что результат всегда имеет тип float.
SELECT SQRT(2) AS Result; -- Результат будет приближеннымResult 1.4142135623730951
История изменений функции
Функция SQRT присутствует в Microsoft SQL Server с самых ранних версий. Ее поведение и сигнатура оставались стабильными на протяжении многих выпусков, включая SQL Server 2000, 2005, 2008, 2012, 2014, 2016, 2017, 2019 и 2022. Основные изменения, связанные с функцией, касаются общей платформы и производительности, а не ее спецификации.
В последних версиях SQL Server, благодаря улучшениям в обработке чисел с плавающей запятой и векторной обработке (в определенных сценариях), вычисления с использованием SQRT могут выполняться быстрее, но это не является изменением самой функции.
Расширенные примеры применения
Вычисление длины гипотенузы по теореме Пифагора:
DECLARE @a FLOAT = 3, @b FLOAT = 4;
SELECT SQRT(POWER(@a, 2) + POWER(@b, 2)) AS Hypotenuse;Hypotenuse 5.0
Использование в запросе для расчета евклидова расстояния между точками:
WITH Points (x1, y1, x2, y2) AS (
SELECT 0, 0, 3, 4
)
SELECT SQRT(POWER(x2 - x1, 2) + POWER(y2 - y1, 2)) AS Distance
FROM Points;Distance 5.0
Обработка возможных отрицательных значений с помощью NULLIF и ABS (если логика допускает взятие корня из модуля):
SELECT
SQRT(ABS(NULLIF(-9, 0))) AS SqrtOfAbs, -- Берем корень из модуля, избегаем NULL
SQRT(NULLIF(-9, 0)) AS DirectSqrt; -- Получаем NULLSqrtOfAbs DirectSqrt 3.0 NULL
Применение в оконных функциях для статистического анализа (например, вычисление среднеквадратического отклонения в комбинации с другими агрегатами):
SELECT
SalesOrderID,
LineTotal,
AVG(LineTotal) OVER() AS AvgSale,
SQRT(VAR(LineTotal) OVER()) AS StdDevSale -- Квадратный корень из дисперсии = стандартное отклонение
FROM Sales.SalesOrderDetail
WHERE SalesOrderID BETWEEN 43660 AND 43670;(Примерный вывод с числовыми данными)
Создание пользовательской функции для безопасного вычисления корня с обработкой ошибок:
CREATE FUNCTION dbo.SafeSqrt (@Value FLOAT)
RETURNS FLOAT
AS
BEGIN
RETURN (SELECT SQRT(NULLIF(@Value, 0))); -- Защита от деления на ноль, если значение используется как делитель
END;
GO
SELECT dbo.SafeSqrt(0) AS ResultZero, dbo.SafeSqrt(9) AS ResultNine;ResultZero ResultNine NULL 3.0
Аналоги функции в других СУБД и языках
MySQL, PostgreSQL, SQLite: Функция имеет идентичное имя SQRT и схожую логику работы (возвращает NULL для отрицательных аргументов в MySQL/PostgreSQL, в SQLite может возвращать NULL или ошибку).
-- PostgreSQL/MySQL
SELECT SQRT(16); -- Результат: 4sqrt 4.0
Oracle: Также использует функцию SQRT. Для отрицательных чисел вызывает ошибку ORA-01428.
SELECT SQRT(16) FROM dual;4
Sybase ASE: Функция SQRT ведет себя аналогично MS SQL.
Язык программирования C#: Math.Sqrt(double d). Для отрицательных чисел возвращает double.NaN (Not a Number), а не NULL.
double result = Math.Sqrt(25); // 5.0
double negResult = Math.Sqrt(-25); // NaNPython (math): math.sqrt(x). Для отрицательных чисел выбрасывает исключение ValueError (если нужна работа с комплексными числами, используют cmath.sqrt).
import math
result = math.sqrt(25) # 5.0
# result = math.sqrt(-25) # ValueError