三角函數 (SQL Trigonometric Functions)

SQL 提供了一系列三角函數,用於進行三角運算。這些函數在幾何計算、物理模擬、信號處理等領域非常有用。

所有三角函數的輸入參數都是以弧度 (radians) 為單位,而非角度 (degrees)。如果需要使用角度,必須先轉換為弧度。

角度與弧度轉換

SQL 提供了 RADIANS()DEGREES() 函數來進行角度與弧度之間的轉換:

RADIANS(degrees)  -- 將角度轉換為弧度
DEGREES(radians)  -- 將弧度轉換為角度

轉換公式

  • 弧度 = 角度 × (π / 180)
  • 角度 = 弧度 × (180 / π)

轉換範例

SELECT RADIANS(180);    -- 結果:3.141592653589793(即 π)
SELECT RADIANS(90);     -- 結果:1.5707963267948966(即 π/2)
SELECT RADIANS(45);     -- 結果:0.7853981633974483(即 π/4)

SELECT DEGREES(PI());   -- 結果:180
SELECT DEGREES(PI()/2); -- 結果:90
SELECT DEGREES(1);      -- 結果:57.29577951308232

基本三角函數

SIN() - 正弦函數

SIN(radians)

計算給定弧度的正弦值,結果範圍為 [-1, 1]。

SELECT SIN(0);              -- 結果:0
SELECT SIN(PI() / 2);       -- 結果:1(sin 90° = 1)
SELECT SIN(PI());           -- 結果:約 0(sin 180° = 0)
SELECT SIN(RADIANS(30));    -- 結果:0.5(sin 30° = 0.5)

COS() - 餘弦函數

COS(radians)

計算給定弧度的餘弦值,結果範圍為 [-1, 1]。

SELECT COS(0);              -- 結果:1
SELECT COS(PI() / 2);       -- 結果:約 0(cos 90° = 0)
SELECT COS(PI());           -- 結果:-1(cos 180° = -1)
SELECT COS(RADIANS(60));    -- 結果:0.5(cos 60° = 0.5)

TAN() - 正切函數

TAN(radians)

計算給定弧度的正切值,即 sin/cos。

SELECT TAN(0);              -- 結果:0
SELECT TAN(PI() / 4);       -- 結果:約 1(tan 45° = 1)
SELECT TAN(RADIANS(45));    -- 結果:約 1

⚠️ 當弧度接近 π/2(90°)或 3π/2(270°)時,正切值趨近無窮大。

COT() - 餘切函數

COT(radians)

計算給定弧度的餘切值,即 cos/sin 或 1/tan。

SELECT COT(PI() / 4);       -- 結果:約 1(cot 45° = 1)
SELECT COT(1);              -- 結果:0.6420926159343308

⚠️ 當弧度接近 0 或 π 時,餘切值趨近無窮大。


反三角函數

反三角函數用於根據三角比值反推角度(以弧度表示)。

ASIN() - 反正弦函數

ASIN(value)

返回正弦值為 value 的弧度。輸入範圍必須在 [-1, 1],結果範圍為 [-π/2, π/2]。

SELECT ASIN(0);     -- 結果:0
SELECT ASIN(1);     -- 結果:1.5707963267948966(即 π/2 = 90°)
SELECT ASIN(0.5);   -- 結果:0.5235987755982989(即 π/6 = 30°)
SELECT DEGREES(ASIN(0.5)); -- 結果:30

ACOS() - 反餘弦函數

ACOS(value)

返回餘弦值為 value 的弧度。輸入範圍必須在 [-1, 1],結果範圍為 [0, π]。

SELECT ACOS(1);     -- 結果:0
SELECT ACOS(0);     -- 結果:1.5707963267948966(即 π/2 = 90°)
SELECT ACOS(-1);    -- 結果:3.141592653589793(即 π = 180°)
SELECT DEGREES(ACOS(0.5)); -- 結果:60

ATAN() - 反正切函數

ATAN(value)

返回正切值為 value 的弧度。結果範圍為 (-π/2, π/2)。

SELECT ATAN(0);     -- 結果:0
SELECT ATAN(1);     -- 結果:0.7853981633974483(即 π/4 = 45°)
SELECT DEGREES(ATAN(1)); -- 結果:45

ATAN2() - 雙參數反正切函數

ATAN2(y, x)

返回從 x 軸到點 (x, y) 的角度(弧度)。與 ATAN(y/x) 不同,ATAN2() 可以正確處理所有象限。

SELECT DEGREES(ATAN2(1, 1));    -- 結果:45(第一象限)
SELECT DEGREES(ATAN2(1, -1));   -- 結果:135(第二象限)
SELECT DEGREES(ATAN2(-1, -1));  -- 結果:-135(第三象限)
SELECT DEGREES(ATAN2(-1, 1));   -- 結果:-45(第四象限)

實用範例

計算兩個經緯度之間的距離(Haversine 公式)

-- 計算地球上兩點之間的距離(公里)
-- lat1, lon1: 第一點的緯度、經度
-- lat2, lon2: 第二點的緯度、經度
SELECT
    6371 * 2 * ASIN(SQRT(
        POWER(SIN(RADIANS(lat2 - lat1) / 2), 2) +
        COS(RADIANS(lat1)) * COS(RADIANS(lat2)) *
        POWER(SIN(RADIANS(lon2 - lon1) / 2), 2)
    )) AS distance_km
FROM
    locations;

計算向量的角度

SELECT
    point_id,
    x,
    y,
    DEGREES(ATAN2(y, x)) AS angle_degrees
FROM
    vectors;

產生圓周上的點

-- 產生圓心在 (0, 0)、半徑為 10 的圓周上 12 個點
SELECT
    n,
    ROUND(10 * COS(RADIANS(n * 30)), 4) AS x,
    ROUND(10 * SIN(RADIANS(n * 30)), 4) AS y
FROM
    (SELECT 0 AS n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 
     UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 
     UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11) AS numbers;

常用角度的三角函數值參考

角度弧度SINCOSTAN
0010
30°π/60.50.8660.577
45°π/40.7070.7071
60°π/30.8660.51.732
90°π/210
180°π0-10

注意事項

  • 所有三角函數的參數單位都是弧度,使用角度前需用 RADIANS() 轉換。
  • 反三角函數的輸入值有範圍限制(如 ASIN()ACOS() 必須在 [-1, 1] 之間)。
  • 由於浮點數精度問題,某些理論上應該精確的值(如 SIN(PI()))可能會有微小誤差。
  • COT(0)TAN(PI()/2) 等會導致除以零的情況,可能產生錯誤或無窮大。