ABS / MOD / POWER
| 対応: | SQL-92(1992) |
|---|
数値演算を行う基本的な関数です。絶対値・剰余・べき乗・平方根・符号など、集計以外の数値処理に使われます。
構文
『ABS』: 絶対値を返します。
ABS(数値)
『MOD』: 剰余(余り)を返します。
MOD(数値, 除数) 数値 % 除数 -- 演算子での記述
『POWER』: べき乗を返します。
POWER(底, 指数) POW(底, 指数) -- MySQLでの別名
『SQRT』: 平方根を返します。
SQRT(数値)
『SIGN』: 数値の符号を返します(正:1, 零:0, 負:-1)。
SIGN(数値)
構文一覧
| 関数・演算子 | 概要 |
|---|---|
| ABS(n) | nの絶対値を返します。負の数を正にします。 |
| MOD(n, m) / n % m | nをmで割った余りを返します。 |
| POWER(n, e) / POW(n, e) | nのe乗を返します。 |
| SQRT(n) | nの正の平方根を返します。nが負の場合はNULLまたはエラーになります。 |
| SIGN(n) | nが正なら1、0なら0、負なら-1を返します。 |
サンプルコード
以下の『shop_sales』テーブルを例に説明します。
売上目標との差額を絶対値で比較します。
sample_abs_mod_power.sql
SELECT
shop_name,
sales,
target,
sales - target AS diff,
ABS(sales - target) AS abs_diff,
SIGN(sales - target) AS achieved -- 1:超過 0:ちょうど -1:未達
FROM shop_sales;
+--------------------+---------+---------+---------+----------+----------+ | shop_name | sales | target | diff | abs_diff | achieved | +--------------------+---------+---------+---------+----------+----------+ | サウスタウン本店 | 3200000 | 3000000 | 200000 | 200000 | 1 | | 草薙流道場前店 | 2600000 | 2800000 | -200000 | 200000 | -1 | | 八神流武術館前店 | 2850000 | 2850000 | 0 | 0 | 0 | +--------------------+---------+---------+---------+----------+----------+ 3 rows in set
売上金額が100万円の倍数かどうかを確認します(MOD)。
sample_abs_mod_power.sql
SELECT
shop_name,
sales,
CASE MOD(sales, 1000000)
WHEN 0 THEN '100万円の倍数'
ELSE '端数あり'
END AS category
FROM shop_sales;
+--------------------+---------+------------+ | shop_name | sales | category | +--------------------+---------+------------+ | サウスタウン本店 | 3200000 | 端数あり | | 草薙流道場前店 | 2600000 | 端数あり | | 八神流武術館前店 | 2850000 | 端数あり | +--------------------+---------+------------+ 3 rows in set
目標金額の5%成長を5年間続けた場合の予測値を求めます(POWER)。
sample_abs_mod_power.sql
SELECT
shop_name,
target,
ROUND(target * POWER(1.05, 5), 0) AS forecast_5yr
FROM shop_sales;
+--------------------+---------+--------------+ | shop_name | target | forecast_5yr | +--------------------+---------+--------------+ | サウスタウン本店 | 3000000 | 3828845 | | 草薙流道場前店 | 2800000 | 3573588 | | 八神流武術館前店 | 2850000 | 3637402 | +--------------------+---------+--------------+ 3 rows in set
売上金額の平方根を計算します(SQRT)。
sample_abs_mod_power.sql
SELECT
shop_name,
sales,
ROUND(SQRT(sales), 2) AS sqrt_sales
FROM shop_sales;
+--------------------+---------+------------+ | shop_name | sales | sqrt_sales | +--------------------+---------+------------+ | サウスタウン本店 | 3200000 | 1788.85 | | 草薙流道場前店 | 2600000 | 1612.45 | | 八神流武術館前店 | 2850000 | 1688.19 | +--------------------+---------+------------+ 3 rows in set
データベース別の書き方
MySQL / MariaDB
『ABS』『POWER』(別名『POW』)・『SQRT』『SIGN』『MOD』関数がすべて使用できます。『%』演算子も利用可能です。
SELECT ABS(sales - target) AS abs_diff FROM shop_sales; SELECT POWER(1.05, 5) AS growth_factor; SELECT MOD(sales, 1000000) AS remainder FROM shop_sales;
PostgreSQL
『ABS』『POWER』『SQRT』『SIGN』『MOD』が使用できます。MySQL の別名『POW』は PostgreSQL では使用できないため、『POWER』を使ってください。
SELECT ABS(sales - target) AS abs_diff FROM shop_sales; SELECT POWER(1.05, 5) AS growth_factor; SELECT MOD(sales, 1000000) AS remainder FROM shop_sales;
SQLite
SQLite では『ABS』『ROUND』は使用できますが、『POWER』『SQRT』『SIGN』は標準では使用できません。これらが必要な場合はアプリケーション側で計算するか、拡張ライブラリを利用します。剰余には『%』演算子を使います。
SELECT ABS(sales - target) AS abs_diff FROM shop_sales; SELECT sales % 1000000 AS remainder FROM shop_sales;
概要
『MOD』はゼロ除算を行うとNULLを返す(MySQLなど)か、エラーになる(DBMSによる)ため注意してください。偶数・奇数の判定や周期的な処理のグループ分けによく使われます。
『SIGN』はCASE式の代わりに正・零・負の3値を数値で返すため、集計と組み合わせて「目標達成店舗の件数」などを COUNT(CASE WHEN ... END) より簡潔に書ける場面があります。
『SQRT』に負の数を渡すとMySQLはNULLを返し、PostgreSQLはエラーになるなどDBMSで挙動が異なります。数値の丸め処理は『ROUND / CEIL / FLOOR』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。