三角函數 (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;
常用角度的三角函數值參考
| 角度 | 弧度 | SIN | COS | TAN |
|---|---|---|---|---|
| 0° | 0 | 0 | 1 | 0 |
| 30° | π/6 | 0.5 | 0.866 | 0.577 |
| 45° | π/4 | 0.707 | 0.707 | 1 |
| 60° | π/3 | 0.866 | 0.5 | 1.732 |
| 90° | π/2 | 1 | 0 | ∞ |
| 180° | π | 0 | -1 | 0 |
注意事項
- 所有三角函數的參數單位都是弧度,使用角度前需用
RADIANS()轉換。 - 反三角函數的輸入值有範圍限制(如
ASIN()和ACOS()必須在 [-1, 1] 之間)。 - 由於浮點數精度問題,某些理論上應該精確的值(如
SIN(PI()))可能會有微小誤差。 COT(0)和TAN(PI()/2)等會導致除以零的情況,可能產生錯誤或無窮大。