05 - 4 수학 함수
수학 함수에는 ABS, CEILING, DEGREES, FLOOR, POWER, RADIANS, SIGN 등 여러 함수가 있습니다. 대부분의 수학 함수는 입력값과 같은 자료형을 반환하지만 EXP, LOG, LOG10, SQUARE, SQRT 등의 기타 함수는 입력값을 실수형인 float형으로 자동 변환한 뒤 반환합니다.
절댓값 구하기 : ABS 함수
ABS 함수는 절댓값을 반환합니다. 예를 들어 -1.0과 같은 음수는 양수로 변환하며 0과 양수에는 영향을 주지 않습니다. 이때 ABS 함수의 인자에는 식을 입력할 수도 있습니다.
-- 절댓값 검색 : ABS 함수
SELECT ABS(-1.0), ABS(0.0), ABS(1.0);
-- 1.0, 0.0, 1.0
SELECT
open_price - close_price AS diff,
ABS(open_price - close_price) AS abs_diff
FROM nasdaq_company
ABS 함수는 자료형의 범위를 넘으면 산술 오버플로 오류가 발생합니다.
-- 절댓값 검색 : 산술 오버플로 오류 발생
SELECT ABS(-2147483648)
-- 메시지 8115, 수준 16, 상태 2, 줄 1
-- expression을(를) 데이터 형식 int(으)로 변환하는 중 산술 오버플로 오류가 발생했습니다.
양수 음수 여부 판단하기 : SIGN 함수
SIGN 함수는 지정한 값이나 식의 양수, 음수, 0을 판단해 1, -1, 0을 반환합니다.
-- 양수 음수 여부 판단 : SIGN 함수
SELECT SIGN(-125), SIGN(0), SIGN(564)
-- -1, 0, 1
SELECT open_price - close_price
SIGN(open_price - close_price)
FROM nasdaq_company
입력 자료형 | 반환 자료형 |
bigint | bigint |
int / smallint / tinyint | int |
money / smallmoney | money |
numeric / decimal | numeric / decimal |
기타 자료형 | float |
SIGN 함수의 입력 자료형과 반환 자료형
천장값과 바닥값 구하기 : CEILING, FLOOR 함수
CEILING 함수는 천장값을 구하는데, 지정한 숫자보다 크거나 같은 최소 정수를 반환합니다. 예를 들어 2.4라면 3을 반환합니다. 반대로 FLOOR 함수는 바닥값을 구하는데, 지정한 숫자보다 작거나 같은 최대 정수를 반환합니다. 예를 들어 2.4라면 2를 반환합니다.
-- 천장값과 바닥값 검색 : CEILING, FLOOR 함수
SELECT CEILING(123.45), CEILING(-123.45), CEILING($0.0);
-- 124, -123, 0.00
SELECT FLOOR(123.45), FLOOR(-123.45), FLOOR($123.45);
-- 123, -124, 123.00
반올림 구하기 : ROUND 함수
ROUND 함수는 반올림을 구합니다. ROUND 함수는 2개 또는 3개의 매개변수가 필요합니다.
-- ROUND 함수의 기본 형식
ROUND(numeric_expression, length [, function])
첫 번째 매개변수인 numeric_expression은 bit 자료형을 제외한 정확한 수치나 근사 자료형 범주의 값을 사용합니다. 두 번째 매개변수인 length는 numeric_expression을 반올림해 표현한 자릿수입니다. 예를 들어 numeric_expressiono이 123.1234이고 length가 3이면 123.1230을 반환합니다. length가 허용하는 자료형은 tiryint, smallint, int입니다. 또한 length에는 양수나 음수를 지정할 수 있는데 양수는 소수부부터 반올림하고, 음수는 정부부부터 반올림합니다. 세 번쨰 매개변수 [, function]은 수행할 연산의 종류입니다. tinyint, smallint, int형 값을 사용하며 생략하면 기본값 0을 적용합니다. 기본값 0은 반올림 결괏값을 자르지 않으며 0 이외의 값을 입력하면 해당 값만큼 반올림 결괏값을 자릅니다.
※ 기본 형식의 대괄호로 감싼 내용은 포함해도 되고 하지 않아도 되는 내용을 의미합니다.
-- ROUND 함수로 3번째 자리까지 반올림
SELECT ROUND(123.9994, 3), ROUND(123.9995, 3);
-- 123.9990, 124.0000
-- ROUND 함수로 소수부와 정수부 반올림 : 양수, 음수 지정
SELECT ROUND(123.4545, 2), ROUND(123.45, -2);
-- 123.4500, 100.00
-- ROUND 함수의 결괏값 자르기 : 세 번째 인수 비교
SELECT ROUND(150.75, 0);
-- 151.00
SELECT ROUND(150.75, 0, 1);
-- 150.00
-- ROUND 함수의 반환값 비교 : 인수로 전달하는 음수의 절댓값에 따라 다름
SELECT ROUND(748.58, -1)
-- 750.00
SELECT ROUND(748.58, -2)
-- 700.00
SELECT ROUND(748.58, -4)
-- 0.00
-- ROUND 함수의 산술 오버플로 오류 발생
SELECT ROUND(748.58, -3)
-- 메시지 8115, 수준 16, 상태 2, 줄 1
-- expression을(를) 데이터 형식 numeric(으)로 변환하는 중 산술 오버프로 오류가 발생했습니다.
입력 자료형 | 반환 자료형 |
tinyint | int |
smllint | int |
int | int |
bigint | bigint |
decimal, numeric(p,s) | decimal(p,s) |
money, smallmoney | money |
float, real | float |
ROUND 함수의 입력 자료형과 반환 자료형
로그 구하기 : LOG 함수
LOG 함수는 로그를 구하는 함수입니다.
$$ log_{b}(a)=c\leftrightarrow b^{c}=a $$로그 정의
-- LOG 함수 기본 형식
LOG(float_expression [, base])
float_expression은 LOG 함수가 계산할 표현식이며, [, base]는 밑을 설정하는 값입니다. float_expression은 float형으로 반환될 수 있는 표현식을 사용해야 합니다. LOG 함수의 밑 기본값은 e입니다.
※ e는 2.718281828··· 정도로 무리수 상수입니다.
-- LOG 함수로 자연 로그 10 계산
SELECT LOG(10)
-- 2.30258509299405
-- LOG 함수로 자연 로그 10 계산 : 밑값 = 5
SELECT LOG(10, 5)
-- 1.43067655807339
e의 n 제곱값 구하기 : EXP 함수
EXP 함수는 e의 n 제곱값을 반환합니다. EXP 함수 역시 float 표현식을 인자로 입력받습니다.
-- EXP 함수 기본 형식
EXP(float_expression)
-- EXP 함수로 e의 n 제곱값 반환 : n = 10
SELECT EXP(10)
-- 22026.4657948067
-- EXP 함수와 LOG 함수로 결괏값 비교
SELECT EXP(LOG(20)), LOG(EXP(20))
-- 20, 20
제곱하기 : POWER, SQUARE 함수
POWER 함수와 SQUART 함수는 각각 거듭제곱과 제곱값을 구합니다. 기본 형식을 보면 POWER 함수는 float형 표현식과 거듭제곱할 값을 인자로 입력받으며 SQUARE 함수는 float형 표현식만 인자로 입력받습니다.
-- POWER, SQUARE 함수의 기본 형식
POWER(float_expression, y)
SQUARE(float_expression)
POWER 함수의 2번쩆 인자인 y는 bit형을 제외한 정확한 수치 또는 근사 자료형의 값입니다.
-- 제곱하기 : POWER, SQUARE 함수
SELECT POWER(2, 3), POWER(2, 10), POWER(2.0, 3)
-- 8, 1024, 8.0
SELECT SQUARE(3.3), SQUARE(10)
-- 10.89, 100
입력 자료형 | 반환 자료형 |
float, real | float |
decimal(p,s) | 10진수(38,s) |
int, smallint, tinyint | int |
bigint | bigint |
money, smallmoney | money |
bit, char, nchar, varchar, nvarchar | float |
POWER 함수의 입력 자료형과 반환 자료형
제곱근 구하기 : SQRT 함수
SQRT 함수는 float형 표현식을 입력받아 제곱근을 반환합니다.
-- SQRT 함수의 기본 형식
SQRT(float_expression)
-- SQRT 함수로 제곱근 반환 : 1, 10 기준
SELECT SQRT(1.00), SQRT(10.00);
-- 1, 3.16227766016838
난수 구하기 : RAND 함수
RAND 함수는 0~1 범위의 배타적 의사 난수 float형 값을 반환합니다.
-- RAND 함수의 기본 형식
RAND([seed])
[seed] 인수에 전달하는 값의 자료형은 tinyint, smallint, int형입니다. 만약 [seed]를 지정하지 않으면 데이터베이스 엔진이 임의로 초깃값을 설정합니다. [seed]는 일종의 난수 종류를 결정하는 값이며 같은 [seed] 값을 설정하면 RAND 함수는 같은 결과를 반환합니다.
-- RAND 함수로 난수 생성 : 같은 쿼리 3번 반복해 비교
SELECT RAND(100), RAND(), RAND()
-- 0.715436657367485, 0.28463380767982, 0.0131039082850364
-- 0.715436657367485, 0.28463380767982, 0.0131039082850364
-- 0.715436657367485, 0.28463380767982, 0.0131039082850364
난수라고 설명했음에도 계속 같은 값이 반환되는 이유는 현재 [쿼리 편집기] 창에서 처음 함수를 실행할 떄 임의의 초깃값을 계속 재사용하기 때문입니다. 다른 쿼리 창을 열어 쿼리를 실행해 보면 다른 결괏값이 검색되는 것을 확인할 수 있습니다.
-- RAND 함수로 난수 생성 : DB가 임의로 설정한 값 출력
DECLARE @counter SMALLINT;
SET @counter = 1;
WHILE @counter < 5
BEGIN
SELECT RAND() Random_Number
SET @counter = @counter + 1
END;
GO
-- 0.2054995913191
-- 0.821844434880088
-- 0.4204955495022
이 경우 RAND 함수 인자에 아무것도 전달하지 않았으므로 데이터베이스 서버가 설정한 임의의 값으로 난수 종류를 보여 주므로 실행할 때마다 다른 난수를 볼 수 있습니다.
삼각함수 : COS, SIN, TAN, ATAN 함수
삼각함수는 COS 함수부터 DEGRESS 함수에 이르기까지 매우 다양합니다. 모든 삼각함수는 float형 인자를 받습니다.
-- COS 함수의 기본 형식
COS(float_expression)
-- COS 함수의 실행 결과
SELECT COS(14.78)
-- -0.599465426194654
-- SIN 함수의 실행 결과
SELECT SIN(45.175643);
-- 0.929607286611012
-- TAN 함수의 실행 결과
SELECT TAN(PI()/2), TAN(45)
-- 1.63312393531954E+16, 0.483055065616578
-- ATAN 함수의 실행 결과
SELECT ATAN(45.87) AS atanCalc1,
ATAN(-181.01) AS atanCalc2,
ATAN(0) AS atanCalc3,
ATAN(0.1472738) AS atanCalc4,
ATAN(197.1099392) AS atanCalc5
-- 1.54899903834808, -1.56527182634403, 0, 0.146222676937652, 1.5657230594361