LOG() / LN() 函數 (SQL LOG() / LN() Function)
SQL 提供了多種對數函數來進行對數運算。對數是指數運算的逆運算,如果 b^y = x,則 log_b(x) = y。
各資料庫支援的對數函數
不同資料庫對 LOG() 函數的解釋有所不同,這是一個容易混淆的地方:
| 函數 | MySQL | PostgreSQL | SQL Server | Oracle |
|---|---|---|---|---|
| LOG(x) | 自然對數 (ln) | 自然對數 (ln) | 以 10 為底 | 自然對數 (ln) |
| LOG(b, x) | 以 b 為底 | 以 b 為底 | 不支援 | 以 b 為底 |
| LN(x) | 自然對數 | 自然對數 | 不支援 | 自然對數 |
| LOG10(x) | 以 10 為底 | 以 10 為底 | 以 10 為底 | 不支援 |
| LOG2(x) | 以 2 為底 | 不支援 | 不支援 | 不支援 |
語法 (Syntax)
自然對數(以 e 為底)
LN(number) -- MySQL, PostgreSQL, Oracle
LOG(number) -- MySQL, PostgreSQL, Oracle(但不包括 SQL Server)
以 10 為底的對數
LOG10(number) -- MySQL, PostgreSQL, SQL Server
LOG(number) -- SQL Server(LOG 在 SQL Server 中預設以 10 為底)
以任意底數為底的對數
LOG(base, number) -- MySQL, PostgreSQL, Oracle
以 2 為底的對數
LOG2(number) -- MySQL
LOG() 函數用法範例 (Example)
基本範例
-- 自然對數(以 e 為底)
SELECT LN(10); -- 結果:2.302585(MySQL, PostgreSQL, Oracle)
SELECT LOG(10); -- 結果:2.302585(MySQL, PostgreSQL)
-- 以 10 為底的對數
SELECT LOG10(1000); -- 結果:3(因為 10³ = 1000)
SELECT LOG10(100); -- 結果:2
-- 以 2 為底的對數(MySQL)
SELECT LOG2(8); -- 結果:3(因為 2³ = 8)
SELECT LOG2(1024); -- 結果:10(因為 2¹⁰ = 1024)
-- 以任意底數為底的對數
SELECT LOG(10, 100); -- 結果:2(因為 10² = 100)
SELECT LOG(2, 8); -- 結果:3(因為 2³ = 8)
計算資料的數量級
SELECT
value,
FLOOR(LOG10(value)) AS magnitude
FROM
measurements
WHERE
value > 0;
| value | magnitude |
|---|---|
| 5 | 0 |
| 50 | 1 |
| 500 | 2 |
| 5000 | 3 |
計算複利的投資年數
如果本金翻倍,年利率為 r,需要多少年?
公式:t = ln(2) / ln(1 + r)
SELECT
annual_rate,
ROUND(LN(2) / LN(1 + annual_rate), 2) AS years_to_double
FROM
interest_rates;
| annual_rate | years_to_double |
|---|---|
| 0.05 | 14.21 |
| 0.07 | 10.24 |
| 0.10 | 7.27 |
計算位元數(二進位位數)
一個正整數需要多少位元來表示:
SELECT
number,
FLOOR(LOG2(number)) + 1 AS bits_required
FROM
numbers
WHERE
number > 0;
| number | bits_required |
|---|---|
| 7 | 3 |
| 8 | 4 |
| 255 | 8 |
| 256 | 9 |
對數刻度轉換
將數據轉換為對數刻度,常用於資料視覺化:
SELECT
product_name,
sales,
ROUND(LOG10(sales + 1), 2) AS log_sales
FROM
products;
對數的數學特性
對數運算有一些重要的數學特性,在 SQL 中也適用:
-- 乘法轉加法
SELECT LOG(10, 100 * 1000); -- 等於 LOG(10,100) + LOG(10,1000) = 2 + 3 = 5
SELECT LOG(10, 100) + LOG(10, 1000);
-- 除法轉減法
SELECT LOG(10, 1000 / 10); -- 等於 LOG(10,1000) - LOG(10,10) = 3 - 1 = 2
SELECT LOG(10, 1000) - LOG(10, 10);
-- 次方轉乘法
SELECT LOG(10, POWER(100, 3)); -- 等於 3 * LOG(10,100) = 3 * 2 = 6
SELECT 3 * LOG(10, 100);
LOG() 與 EXP() 的關係
LN() 和 EXP() 互為逆運算:
SELECT LN(EXP(5)); -- 結果:5
SELECT EXP(LN(100)); -- 結果:100
底數轉換公式
如果資料庫不支援特定底數的對數,可以使用轉換公式:
log_b(x) = ln(x) / ln(b)
-- 計算以 3 為底、27 的對數(在不支援 LOG(base, number) 的資料庫中)
SELECT LN(27) / LN(3); -- 結果:3(因為 3³ = 27)
注意事項
- 對數函數的參數必須大於 0。
LOG(0)或LOG(-1)會產生錯誤或返回NULL。 LOG(NULL)或LN(NULL)的結果是NULL。- 注意不同資料庫對
LOG()函數預設底數的差異(SQL Server 預設以 10 為底,其他多數預設為自然對數)。 - 在跨資料庫開發時,建議明確使用
LOG10()或LN()以避免混淆。