LOG() / LN() 函數 (SQL LOG() / LN() Function)

SQL 提供了多種對數函數來進行對數運算。對數是指數運算的逆運算,如果 b^y = x,則 log_b(x) = y

各資料庫支援的對數函數

不同資料庫對 LOG() 函數的解釋有所不同,這是一個容易混淆的地方:

函數MySQLPostgreSQLSQL ServerOracle
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;
valuemagnitude
50
501
5002
50003

計算複利的投資年數

如果本金翻倍,年利率為 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_rateyears_to_double
0.0514.21
0.0710.24
0.107.27

計算位元數(二進位位數)

一個正整數需要多少位元來表示:

SELECT
    number,
    FLOOR(LOG2(number)) + 1 AS bits_required
FROM
    numbers
WHERE
    number > 0;
numberbits_required
73
84
2558
2569

對數刻度轉換

將數據轉換為對數刻度,常用於資料視覺化:

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)

注意事項

  • 對數函數的參數必須大於 0LOG(0)LOG(-1) 會產生錯誤或返回 NULL
  • LOG(NULL)LN(NULL) 的結果是 NULL
  • 注意不同資料庫對 LOG() 函數預設底數的差異(SQL Server 預設以 10 為底,其他多數預設為自然對數)。
  • 在跨資料庫開發時,建議明確使用 LOG10()LN() 以避免混淆。