본문 바로가기
공부/Oracle

오라클 SQL 문법 공부8 - ROUND, TURNC, MOD, FLOOR, CEIL, ABS, SIGN

by 리빈아빠 2017. 9. 22.
반응형

서론

이번에는 주로 숫자형 데이터를 처리하는 함수들을 배워볼 차례이다. 

본론

ROUND, TRUNC

--ROUND(숫자 [,m]) 반올림 / TRUNC(숫자, [,m]) 버림
select round(12343.46),  --뒤에 인자 없으면 소수점 첫번째 자리에서 반올림
       round(1234.56, 1),  --소수점 2번째 자리에서 반올림하여 1자리로 표시
       round(1234.56, 2),  --소수점 3번째 자리가 없어서 그대로
       round(1234.56, -1) --정수 1자리에서 반올림
  from dual;

SELECT TRUNC(1234.45) FROM DUAL;

--ROUND(날짜, 단위), trunc
--라운드 반올림, trunc 버림
--날짜를 년, 월 단위로 반올림, 버림(단위: 'month', 'year')
--단위를 쓰지 않으면 시간에서 반올림, 버림된다.
select sysdate, round(sysdate), trunc(sysdate) from dual;

숫자형 데이터들을 반올림하는 함수 ROUND와 내림하는 TRUNC 함수이다. 뒤에 인자가 양수이면 해당 소수점 자리에서 반올림 혹은 내림하여 앞자리까지 나타내는 것이고 음수이면 해당 정수자리에서 반올림 하거나 내림 하는 것만 기억 하면 된다. 아무런 인자가 없을때는 소수 첫번째 자리에서 반올림 혹은 내림 한 후 정수값을 나타내 준다.


굳이 소수점을 자를려고 숫자형을 문자형으로 변경한 후 SUBSTR, INSTR 할 필요 없이 이 함수를 쓰면 편리하다.


또한 날짜형 데이터들도 함수를 쓸 수 있다. 뒤에 인자가 없으면 시간에서 각각 반올림, 내림을 하는데 12시를 기준으로 날짜가 증가하거나 유지 된다고 보면 된다.

MOD, FLOOR, CEIL, ABS, SIGN

--MOD(m,n) m을 n으로 나누어 남은 값 반환
--FLOOR(n) 주어진 값보다 작거나 같은 최대 정수를 구하는 함수
--CEIL(n) 주어진 값보다는 크지만 가장 근접하는 최소 정수를 구하는 함수
select mod(10, 3),
floor(1.333),
ceil(1.333)
from dual;

--ABS(n) n의 절대값을 계산하여 반환
--SIGN(n) 숫자가 양수이면 1, 음수이면 -1, 0이면 0을 반환하는 함수
select decode(sign(sal - 1000), 1, '천보다큼', -1, '천보다 작음', 1000) as test, sal from emp;

각각 숫자형들을 다뤄주는 함수들이다. MOD는 나눈 값의 나머지를 반환해주는 함수이다. 예를 들어 특정숫자를 3으로 나누어서 나눈 나머지가 0이면 3의 배수, 아니면 3의 배수가 아니다 라는 등의 표현에 쓰일 수 있다.


FLOOR는 소수 첫번째 자리에서 올림, CEIL은 소수 첫번째 자리에서 내림 하여 둘다 정수형으로 표현하는 함수이다. 


ABS는 절대값을 표현해주는 함수이며 SIGN 함수는 양수인지 음수 인지, 0인지를 각각 1, -1, 0으로 표현해주는 함수이다.

실습문제

--1. emp테이블에서 현재까지 근무일수가 몇 주, 혹은 몇 일인가를 출력하여라.
--단, 근무일수가 많은 사람 순으로 출력하여라
select * from emp;
SELECT ENAME,
TRUNC((SYSDATE - HIREDATE) / 7) AS "근속주수",
TRUNC(SYSDATE - HIREDATE) AS "근속일수"/*,
mod(TRUNC(SYSDATE - HIREDATE), 7) AS "나머지근속일수" */
FROM EMP
ORDER BY "근속일수" DESC;

--2) professor 테이블을 이용하여 id와 email 주소의 id(email 컬럼의 @ 앞 문자)가
--다른경우 email 주소를 id로 변경하여 출력하여라.
--ex)송도권 id : powerman, email id : pman, 새로운 email: powerman@power.com
--select * from professor;
select '송도권 id : ' || id || ', email id : ' || substr(email, 1, instr(email, '@') -1) || ', 새로운 email: ' || id || substr(email, instr(email, '@'))
from professor
where id <> substr(email, 1, instr(email, '@') -1);

결론

이번에는 그냥 이런 함수들이 있구나 정도로 알고 있으면 좋을 것 같다. 실습문제는 해당 블로그의 문법공부4에 샘플데이터 SQL 파일이 있으니 가져다가 DB에 입력후 직접 사용해보자.