POWER: примеры (SQL)
POWER(numeric_expression, power): Same as inputФункция POWER в MS SQL Server
Функция POWER в MS SQL Server предназначена для возведения числа в указанную степень. Она является математической функцией и широко используется в расчетах, требующих экспоненциального роста, вычисления площадей, объемов, сложных процентов или любых других операций, связанных со степенями.
Синтаксис функции: POWER ( expression, power )
- expression – числовое выражение, которое возводится в степень. Может быть любого типа данных, за исключением типов
bit. Это основание. - power – числовое выражение, определяющее степень, в которую возводится основание. Может быть любого типа данных, за исключением типов
bit. Это показатель степени.
Возвращаемый тип данных определяется типом входного аргумента expression. В большинстве случаев, если expression имеет тип float или real, возвращается float. Для других числовых типов (decimal, int, numeric, money, smallmoney, smallint, tinyint, bigint) возвращаемый тип рассчитывается по правилам неявного преобразования типов с приоритетом.
Функция возвращает NULL, если любой из аргументов равен NULL.
Простые примеры использования
Возведение положительного числа в степень:
SELECT POWER(2, 3) AS Result;Result ------- 8
Возведение в дробную степень (извлечение корня):
SELECT POWER(27, 1.0/3) AS CubeRoot;CubeRoot -------- 3.0
Использование с отрицательным основанием и целой степенью:
SELECT POWER(-2, 3) AS Result;Result ------- -8
Возведение в нулевую степень всегда дает 1:
SELECT POWER(5, 0) AS Result, POWER(0, 0) AS Result2;Result Result2 ------- ------- 1 1
Возведение нуля в положительную степень:
SELECT POWER(0, 5) AS Result;Result ------- 0
Работа с десятичными типами данных:
SELECT POWER(CAST(1.5 AS DECIMAL(5,2)), 4) AS Result;Result ---------- 5.062500
Альтернативные функции в MS SQL
- SQRT ( expression ) – специализированная функция для вычисления квадратного корня числа. Она эквивалентна
POWER(expression, 0.5), но может быть более читаемой для этой конкретной операции. - SQUARE ( expression ) – функция для возведения числа в квадрат. Эквивалентна
POWER(expression, 2). Ее использование делает код более явным при вычислении квадрата значения. - EXP ( float_expression ) – функция для вычисления экспоненты (e в степени указанного числа). Для возведения числа e в степень предпочтительнее использовать
EXP, а неPOWER(2.71828182845905, power). - LOG ( float_expression [, base ] ) – функция, обратная
POWER. Вычисляет логарифм числа. Если нужен натуральный логарифм или логарифм по другому основанию, используют эту функцию.
Выбор между POWER, SQRT и SQUARE часто зависит от ясности кода. Для квадратов и квадратных корней специализированные функции понятнее. POWER универсальна и подходит для любой степени.
Типичные ошибки и особенности
Ошибка арифметического переполнения: При работе с целыми типами и большими степенями может произойти переполнение.
SELECT POWER(10, 10) AS Result; -- INT переполнениеMsg 8115, Level 16, State 2... Arithmetic overflow error converting expression to data type int.
Решение – использовать типы с большей емкостью или десятичные типы:
SELECT POWER(CAST(10 AS BIGINT), 10) AS Result;
SELECT POWER(10.0, 10) AS Result;Result ----------- 10000000000 ----------- 10000000000.0
Возведение отрицательного числа в дробную степень: Попытка вычислить четный корень из отрицательного числа приводит к ошибке домена, так как результат не является вещественным числом.
SELECT POWER(-4, 1.0/2) AS Result; -- Квадратный корень из -4Msg 3623, Level 16, State 1... An invalid floating point operation occurred.
Неявное преобразование типов: Важно контролировать типы данных, чтобы избежать неожиданного округления или ошибок.
SELECT POWER(9, 1/2); -- 1/2 для целых чисел = 0Result ------- 1.0
Правильно:
SELECT POWER(9, 1.0/2);Result -------- 3.0
История изменений функции
Функция POWER присутствует в SQL Server с ранних версий, и ее основная логика работы не претерпела значительных изменений.
В современных версиях SQL Server (начиная с SQL Server 2008 и далее) изменения касались в основном интеграции с другими компонентами, такими как увеличение производительности при работе с типами данных decimal и float в рамках общего развития ядра СУБД. Специфических новых аргументов или флагов для функции POWER не добавлялось.
Ключевой момент для разработчика – функция стабильна и ее поведение согласовано во всех актуальных поддерживаемых версиях SQL Server.
Расширенные примеры применения
Вычисление сложного процента: Формула A = P * (1 + r/n)^(nt).
DECLARE @Principal DECIMAL(10,2) = 1000.00;
DECLARE @Rate FLOAT = 0.05;
DECLARE @TimesCompounded INT = 12;
DECLARE @Years INT = 5;
SELECT
@Principal * POWER(1 + @Rate / @TimesCompounded, @TimesCompounded * @Years)
AS FutureValue;FutureValue ------------------- 1283.35867875501
Генерация геометрической прогрессии:
WITH Numbers AS (
SELECT 0 AS n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
)
SELECT n, POWER(2, n) AS GeometricSeq FROM Numbers;n GeometricSeq --- ------------ 0 1 1 2 2 4 3 8
Проверка на четность через возведение (-1) в степень:
SELECT
number,
CASE POWER(-1, number)
WHEN 1 THEN 'Четное'
WHEN -1 THEN 'Нечетное'
END AS Parity
FROM (VALUES (1), (2), (3), (4)) AS T(number);number Parity ------ ---------- 1 Нечетное 2 Четное 3 Нечетное 4 Четное
Вычисление длины гипотенузы (теорема Пифагора):
DECLARE @a FLOAT = 3, @b FLOAT = 4;
SELECT SQRT(POWER(@a, 2) + POWER(@b, 2)) AS Hypotenuse;
-- Или с SQUARE
SELECT SQRT(SQUARE(@a) + SQUARE(@b)) AS Hypotenuse;Hypotenuse ---------- 5.0
Округление до заданного разряда с использованием степеней 10:
DECLARE @Value FLOAT = 123.456789;
DECLARE @Decimals INT = 2;
SELECT ROUND(@Value, @Decimals) AS Rounded,
ROUND(@Value * POWER(10, @Decimals), 0) / POWER(10, @Decimals) AS RoundedManual;Rounded RoundedManual ---------------- ------------- 123.460000000000 123.46
Работа в оконных функциях для расчета накопленного роста:
WITH MonthlyGrowth AS (
SELECT 1 AS Month, 1.02 AS GrowthFactor UNION ALL
SELECT 2, 1.05 UNION ALL
SELECT 3, 0.98
)
SELECT
Month,
GrowthFactor,
EXP(SUM(LOG(GrowthFactor)) OVER (ORDER BY Month)) AS CumulativeProduct,
-- Альтернатива через POWER и произведение не применима напрямую,
-- этот пример показывает связь POWER/LOG.
LOG(GrowthFactor) AS LnGrowth
FROM MonthlyGrowth;Month GrowthFactor CumulativeProduct LnGrowth ----- ------------- ----------------- --------- 1 1.02 1.02 0.019802... 2 1.05 1.071 0.048790... 3 0.98 1.04958 -0.020202...
Аналоги функции в других СУБД и языках
MySQL: Используется функция POWER(x, y) или оператор POW(x, y). Синтаксис и поведение идентичны SQL Server.
SELECT POW(2, 8);256
Oracle: Функция POWER(x, y). Имеет аналогичное поведение. Также есть функция EXP для экспоненты.
SELECT POWER(10, 2) FROM DUAL;100
PostgreSQL: Функция POWER(x, y). Также поддерживает оператор ^ для возведения в степень (например, 2.0 ^ 3.0).
SELECT POWER(5, 3), 5.0 ^ 3.0;power | ?column? ------+---------- 125 | 125
SQLite: Встроенной функции POWER нет. Используется функция pow(x, y) из модуля math, доступного через расширения, или пишется пользовательская функция. Часто вычисления производятся на стороне приложения.
Sybase ASE: Функция POWER(x, y) работает аналогично SQL Server.
Python: Используется оператор ** (x ** y) или встроенная функция pow(x, y).
print(2 ** 10)
print(pow(2, 10))1024 1024
JavaScript: Используется метод Math.pow(x, y) или оператор ** (в ES2016 и новее).
console.log(Math.pow(3, 4));
console.log(3 ** 4);81 81