데이터베이스

데이터베이스_K_Digital_chapter03

강용민 2022. 8. 16. 10:57

숫자관련 함수

round함수 : 반올림 함수

Round함수는 특정 소수점을 반올림하고 나머지는 버리는 함수이다.

표기는 다음과 같다. round(컬럼||숫자, 표시되는 소수점이하 자리수)

select round(12.5123) r1,round(12.5123,0) r2, round(12.5123,1)r3, 
round(12.5123,2) r4, round(12.5123,-1) r5 from dual;

--R1 : 13 , R2 : 13, R3 : 12.5 , R4 : 12.51, R5 : 10

trunc함수 : 버림함수

trunc함수는 특정 소수점까지 절사하는 함수이다.

표기는 다음과 같다. trunc(컬럼||숫자, 표시되는 소숫점이하 자리수)

select trunc(12.5123) r1,trunc(12.5123,0) r2, trunc(12.5123,1)r3,
trunc(12.5123,2) r4, trunc(12.5123,-1) r5 from dual;

--R1 : 12, R2 : 12, R3 : 12.5, R4 : 12.51, R5 : 10

mod 함수 : 나머지함수

mod함수는 나머지를 구할때 사용하는 함수이다.

표기는 다음과 같다. mod( 값||나누는 값)

select mod(12, 10) from dual
--2

ceil(큰근사정수), floor(작은근사정수) : 근사정수

ceil과 floor은 인자값에 가까운 정수를 도출하는 함수이다.

차이점이라면 ceil은 가까운 두 정수 중 큰 정수를, floor은 작은 정수를 도출한다.

select ceil(12.345), floor(12.345), ceil(-12.345), floor(-12.345) from dual;

--ceil(12.345) : 13, floor(12.345) : 12, ceil(-12.345) : -12, floor(-12.345) : -13

power, abs, sign함수

power은 제곱함수로 표기는 power(값, 제곱),

abs는 절대값 함수,

sign는 부호함수이다. 양수일 경우 1, 음수일 경우 -1, 0은 0이다.

--power : 제곱함수
select power(2,3) from dual; --8

--abs : 절대값 함수
select abs(-5) a1, abs(5) a2 from dual;--5,5

--sign : 부호. 1:양수, -1:음수, 0:0
select sign(10),sign(-10), sign(0) from dual; --1,-1,0

 

날짜 관련 함수

sysdate : 현재 날짜 리턴

months_between : 두 날짜 사이의 개월 수 리턴

add_months : 개월 수를 더한 후의 날짜 리턴

last_day : 해당 날짜의 월의 마지막 일자 리턴

--sysdate :  현재 날짜를 리턴. 예약어
select sysdate from dual;
--months_between : 두날짜사이의 개월수 리턴. 소숫점 표현됨
--months_between(날짜1, 날짜2) : 날짜1 - 날짜2 차이의 개월 수
select months_between(sysdate, '22/01/01') from dual;
--7.498...

--add_months : 개월수를 더한 후의 날짜 리턴
select sysdate, add_months(sysdate,3) as "3개월후",
add_months(sysdate,-3) as "3개월전" from dual;

--last_day : 해당 월의 마지막 일짜 리턴
select sysdate, last_day(sysdate) from dual;

문제

--문제
--1.사원테이블에서 사원의 이름, 직업, 입사일,근무일수 출력하기
--근무일수는 버림하여 정수로 출력
--2.사원테이블에서 입사후 3개월을 수습기간이라고 가정할때 수습 종료일 출력하기
--사원이름, 직업, 입사일, 수습종료일 출력하기
--3.사원테이블의 이름, 입사일, 휴가보상일 출력하기
--휴가보상일 : 입사월의 마지막 일자
select ename,job,hiredate, trunc(sysdate-hiredate) as "근무일수" from emp;
select ename,job,hiredate, add_months(hiredate,3) as "수습 종료일" from emp;
select ename, hiredate,last_day(hiredate) as "휴가보상일" from emp;

 

형변환 함수

to_char(숫자, '형식문자')

날짜, 숫자, 문자 값을 지정한 형식의 varchar2 타입 문자열로 변환하는 함수이다.

지정 형식 설명 결과
CC 세기 TO_CHAR(SYSDATE, 'CC') 21
YYYY or YYY or YY or Y 연도 TO_CHAR(SYSDATE, 'YYYY') 2021
Y,YYY 콤마가 있는 연도 TO_CHAR(SYSDATE, 'Y,YYY') 2,201
YEAR 문자로 표혐된 연도 TO_CHAR(SYSDATE, 'YEAR') TWENTY TWENTYONE
BC or AD BC/AD 지시자 TO_CHAR(SYSDATE, 'BC') 서기
Q 분기 TO_CHAR(SYSDATE, 'Q') 1
MM 두 자리 값의 월 TO_CHAR(SYSDATE, 'MM') 04
MONTH 아홉 자리를 위해 공백을 추가한 월 이름 TO_CHAR(SYSDATE, 'MONTH') 4월
MON 세 자리의 약어로 된 월 이름(영문 설정일 경우) TO_CHAR(SYSDATE, 'MON') 4월
RM 로마 숫자 월 TO_CHAR(SYSDATE, 'RM') IV
WW or W 연, 월의 주 TO_CHAR(SYSDATE, 'WW') 16
DDD or DD or D 연, 월, 주의 일 TO_CHAR(SYSDATE, 'DD') 18
DAY 아홉 자리를 위해 공백을 추가한 요일 이름 TO_CHAR(SYSDATE, 'DAY') 일요일
DY 세 자리 약어로 된 요일 이름 (영문 설정일 경우) TO_CHAR(SYSDATE, 'DY')
J Julian day, BC 4713년 12월 31일 이후의 요일 수 TO_CHAR(SYSDATE, 'J') 2459323
SELECT TO_CHAR(SYSDATE,'YY'), 
	TO_CHAR(SYSDATE,'YYYY'), 
	TO_CHAR(SYSDATE,'MM'), 
	TO_CHAR(SYSDATE,'MON'), 
	TO_CHAR(SYSDATE,'YYYYMMDD') 응용적용1, 
	TO_CHAR(TO_DATE('20210420'),'YYYYMMDD') 응용적용2 
FROM DUAL;

to_number : 문자를 숫자로 변환하는 함수

to_date : 문자를 날짜로 변화하는 함수

 

일반함수

nvl

해당 칼럼의 값이 Null 값인 경우 특정값으로 출력하고 싶을때 사용하는 함수

표기법은 nvl('값','지정값')이다.

select ename, comm, nvl(comm,0) as "nvl" from emp;
--comm이 null 값일 경우 0을 출력

 

조건함수

decode함수

decode함수는 오라클 쿼리에서 사용하는 함수로 표준 sql함수는 아니다.

대신 case when을 많이 사용한다. 기능은 if else와 비슷한 기능을 수행한다.

표기법은 다음과 같다. decode(컬럼, 조건1, 조건2, ...)

더보기

 

기본식과 도해

(1) A=B이면 X, A≠B이면 Y를 출력

select decode(컬럼이름A, 비교대상값B, 출력값X, 출력값Y), ... from 테이블이름;

(2) A=B이면 X, A=C이면 Y, A≠B, A≠C이면 Z 출력하는 경우

select decode(컬럼이름A, 비교대상값B, 출력값X, 비교대상값C, 출력값Y, 출력값Z), ... from 테이블이름;

(3) DECODE 함수의 중복 :

A1=B이면서 A2=C이면 X 출력,

A1=B이면서 A2≠C이면 Y출력,

A1≠B이면 Z 출력하는 경우

select decode(컬럼이름A1, 비교대상값B, decode(컬럼이름A2, 비교대상값B, 출력값X, 출력값Y), 출력값Z), ... from 테이블이름;
--decode함수
select deptno, decode(deptno, 10, '총무부',
			    20,'인사부',
                            30,'재무부') as "부서 이름"
from emp;

--case when then함수
select deptno
	case when deptno=10 then ' 총무부'
    	when deptno=20 then ' 인사부'
     	    	     else '재무부'
	end as "부서이름"
from emp;

 

문제

--문제
--1. 학생이 생일이 1~3월인 경우 1분기, 4~6월 2분기, 7~9월 3분기,
-- 10~12월 4분기 출생분기라 한다.
--학생의 이름, 주민번호, 출생분기를 출력하기
--단 생일은 주민번호 기중으로 한다.
select name,jumin,
  case when substr(jumin,3,2) between '01' and '03' then '1분기'
  when substr(jumin,3,2) between '04' and '06' then '2분기'
  when substr(jumin,3,2) between '07' and '09' then '3분기'
  when substr(jumin,3,2) between '10' and '12' then '4분기'
  end 출생분기
from student;
--2. 학생의 생일이 1~3월인 경우 1분기, 4~6월 2분기, 7~9월 3분기,
--10~12월 4분기 출생분기라 한다.
--학생의 이름, birthday, 출생분기를 출력하기
--birth
select name,birthday,
  case
when to_char(birthday,'mm') between '01' and '03' then '1분기'
when to_char(birthday,'mm') between '04' and '06' then '2분기'
when to_char(birthday,'mm') between '07' and '09' then '3분기'
when to_char(birthday,'mm') between '10' and '12' then '4분기'
end as "출생분기"
from student;

 

 

[참조]

https://sorrow16.tistory.com/156

https://m.blog.naver.com/regenesis90/222182177281