SQRT: примеры (SQL)

Функция SQRT в SQL Server: извлечение квадратного корня
Раздел: Математические функции, Математические
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; -- Деление на NULL
Result
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 могут выполняться быстрее, но это не является изменением самой функции.

Расширенные примеры применения

Вычисление длины гипотенузы по теореме Пифагора:

Пример sql
DECLARE @a FLOAT = 3, @b FLOAT = 4;
SELECT SQRT(POWER(@a, 2) + POWER(@b, 2)) AS Hypotenuse;
Hypotenuse
5.0

Использование в запросе для расчета евклидова расстояния между точками:

Пример sql
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 (если логика допускает взятие корня из модуля):

Пример sql
SELECT 
    SQRT(ABS(NULLIF(-9, 0))) AS SqrtOfAbs, -- Берем корень из модуля, избегаем NULL
    SQRT(NULLIF(-9, 0)) AS DirectSqrt; -- Получаем NULL
SqrtOfAbs DirectSqrt
3.0       NULL

Применение в оконных функциях для статистического анализа (например, вычисление среднеквадратического отклонения в комбинации с другими агрегатами):

Пример sql
SELECT 
    SalesOrderID,
    LineTotal,
    AVG(LineTotal) OVER() AS AvgSale,
    SQRT(VAR(LineTotal) OVER()) AS StdDevSale -- Квадратный корень из дисперсии = стандартное отклонение
FROM Sales.SalesOrderDetail
WHERE SalesOrderID BETWEEN 43660 AND 43670;
(Примерный вывод с числовыми данными)

Создание пользовательской функции для безопасного вычисления корня с обработкой ошибок:

Пример sql
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); -- Результат: 4
sqrt
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); // NaN

Python (math): math.sqrt(x). Для отрицательных чисел выбрасывает исключение ValueError (если нужна работа с комплексными числами, используют cmath.sqrt).

import math
result = math.sqrt(25) # 5.0
# result = math.sqrt(-25) # ValueError

MS SQL SQRT function comments

En
SQRT Returns the square root of the specified float value