수학 함수·연산자
수학 함수·연산자
집계·반올림·삼각함수가 필요할 때, 대부분 그냥 SQL 안에서 해결돼요. PostgreSQL은 여러 타입에 걸쳐 쓸 수 있는 수학 연산자와 함수를 풍부하게 제공하니까요. "이 타입에는 이 연산자가 동작하는지", "결과는 어떤 타입인지"만 익숙하면 바로 활용할 수 있어요. 이 페이지에서 수학 연산자와 함수들의 핵심을 정리해 볼게요.
수학 연산자
수학 연산자는 많은 PostgreSQL 타입에 제공돼요. 표준 수학 관례가 없는 타입(예: date/time 타입)의 실제 동작은 별도 절에서 다뤄요.
연산자 설명에서 numeric_type을 받는 것으로 표시된 것들은 smallint, integer, bigint, numeric, real, double precision 모두에 사용할 수 있어요. integral_type을 받는 연산자는 smallint, integer, bigint에 사용할 수 있고요. 별도 표기가 없으면 각 연산자는 인자와 같은 데이터 타입을 반환해요. integer + numeric처럼 여러 인자 타입이 섞인 호출은 이 목록에서 더 뒤에 나타나는 타입을 사용해 해석돼요.
| 연산자 | 설명 | 예시 |
|---|---|---|
+ |
덧셈. | 2 + 3 → 5 |
+ (단항) |
단항 플러스 (동작 없음). | + 3.5 → 3.5 |
- |
뺄셈. | 2 - 3 → -1 |
- (단항) |
부호 반전. | -(-4) → 4 |
* |
곱셈. | 2 * 3 → 6 |
/ |
나눗셈. (정수 타입에서는 0 방향으로 잘림) | 5.0 / 2 → 2.5000000000000000, 5 / 2 → 2, (-5) / 2 → -2 |
% |
모듈로(나머지). smallint·integer·bigint·numeric에 사용 가능. |
5 % 4 → 1 |
^ |
거듭제곱. | 2 ^ 3 → 8 |
|/ |
제곱근. | |/ 25.0 → 5 |
||/ |
세제곱근. |
거듭제곱 ^는 흔한 수학 관례와 달리 기본적으로 왼쪽에서 오른쪽으로 결합해요. 그래서 2 ^ 3 ^ 3은 512, 괄호를 친 2 ^ (3 ^ 3)은 134217728이 돼요.
수학 함수
많은 수학 함수는 인자 타입이 다른 여러 형태로 제공돼요. 자주 쓰는 것들을 보면 이렇습니다.
abs(x)→ 절댓값.abs(-17.4)→17.4cbrt(x)→ 세제곱근.cbrt(64.0)→4ceil(x)/ceiling(x)→ 인자보다 크거나 같은 가장 가까운 정수.ceil(42.2)→43,ceil(-42.8)→-42div(y, x)→y / x의 정수 몫 (0 방향으로 잘림).div(9, 4)→2floor(x)→ 인자보다 작거나 같은 가장 가까운 정수.gcd(a, b)/lcm(a, b)→ 최대공약수 / 최소공배수.gcd(1071, 462)→21ln(x)/log(x)→ 자연로그 / 상용로그(밑 10).ln(2.0)→0.6931471805599453log(b, x)→ 밑이 b인 로그.mod(y, x)→y / x의 나머지.mod(9, 4)→1pi()→ π의 근삿값.power(a, b)→a^b.round(x)/round(x, n)→ n 자리까지 반올림.round(42.4382, 2)→42.44sign(x)→ 부호 (-1, 0, +1).sqrt(x)→ 제곱근.trunc(x)/trunc(x, n)→ 0 방향으로 버림.trunc(42.4382, 2)→42.43width_bucket(operand, low, high, count)→ 히스토그램 버킷 계산.
삼각 함수
각 삼각 함수는 라디안을 쓰는 버전과 도(degree)를 쓰는 버전 두 가지가 있어요.
| 함수 | 설명 | 예시 |
|---|---|---|
acos(x) |
아크코사인 (라디안). | acos(1) → 0 |
acosd(x) |
아크코사인 (도). | acosd(0.5) → 60 |
asin(x) / asind(x) |
아크사인 (라디안 / 도). | asin(1) → 1.5707963267948966, asind(0.5) → 30 |
atan(x) / atand(x) |
아크탄젠트 (라디안 / 도). | atan(1) → 0.7853981633974483, atand(1) → 45 |
atan2(y, x) / atan2d(y, x) |
y/x의 아크탄젠트 (라디안 / 도). |
atan2(1, 0) → 1.5707963267948966, atan2d(1, 0) → 90 |
cos(x) / cosd(x) |
코사인 (라디안 / 도). | cos(0) → 1, cosd(60) → 0.5 |
cot(x) / cotd(x) |
코탄젠트 (라디안 / 도). | cot(0.5) → 1.830487721712452, cotd(45) → 1 |
sin(x) / sind(x) |
사인 (라디안 / 도). | sin(1) → 0.8414709848078965, sind(30) → 0.5 |
tan(x) / tand(x) |
탄젠트 (라디안 / 도). | tan(1) → 1.5574077246549023, tand(45) → 1 |
도 단위 각도를 다루는 또 다른 방법은 앞서 본 radians()·degrees() 단위 변환 함수를 쓰는 거예요. 하지만 도 단위 삼각 함수를 쓰는 게 권장되는데, sind(30) 같은 특수한 경우 반올림 오류를 피할 수 있어서예요.
쌍곡선 함수
쌍곡선 함수도 제공돼요.
sinh(x)→ 쌍곡사인.sinh(1)→1.1752011936438014cosh(x)→ 쌍곡코사인.cosh(0)→1tanh(x)→ 쌍곡탄젠트.tanh(1)→0.7615941559557649asinh(x)/acosh(x)/atanh(x)→ 역쌍곡사인 / 역쌍곡코사인 / 역쌍곡탄젠트.asinh(1)→0.881373587019543,acosh(1)→0,atanh(0.5)→0.5493061443340548