Oracle 함수
1) 문자형 함수 : 문자를 입력 받고 문자와 숫자 값 모두를 RETURN 할 수 있다.
2) 숫자형 함수 : 숫자를 입력 받고 숫자를 RETURN 한다.
3) 날짜형 함수 : 날짜형에 대해 수행하고 숫자를 RETURN 하는 MONTHS_BETWEEN 함수를 제외하고 모두 날짜 데이터형의 값을 RETURN 한다.
4) 변환형 함수 : 어떤 데이터형의 값을 다른 데이터형으로 변환한다.
5) 일반적인 함수 : NVL, DECODE
문자열 함수 (length, concat, substr, lpad, rpad, rtrim, ltrim)
select initcap('the super man')from dual; -- The Super Man
select lower('AAA') , upper('aaaaa') from dual;
select ename, lower(ename) as "ename" from emp;
select *
from emp
where lower(ENAME) = 'king';
-- 문자의 개수를 구하는 것 (length)
select length('abcd') from dual;
select length('홍길동') from dual;
select length(' 홍a길 동') from dual;
--결합 연산자 || 여러개를 합칠 수 있어서 확장성이 좋다.
-- 결합 함수 concat()
select 'a' || 'b' from dual;
select concat('a','b') from dual;
select concat(ename,job)from emp;
관리자
--부분 문자열 추출 java = substring
--부분 문자열 추출 oracle = substr('추출할 문자열',시작되는 지점,끝나는 지점)
select substr('ABCDE',2,3) from dual; -- 2번째 부터 3개를 추출
select substr('ABCDE',1,1) from dual; -- 자기자신이 나온다.
select substr('ABCDE',3,1) from dual; --C
select substr('ABCDE',3) from dual; --3번째부터 뒤로 다나온다.
select substr('ABCDE',-2,1) from dual; -- -는 뒤에서 부터 자리수를 샌다.
select substr('ABCDE',-2,2) from dual; -- DE
--Quiz
/*
사원 테이블에서 ename컬럼 데이터에 대해서 첫글자는 소문자로
나머지는 대문자로 출력하되 하나의 컬럼 데이터로 출력하세요
--컬럼의 가명칭 : fullname
--첫글자와 나머지 문자 사이에 공백하나 있어요
*/
select lower(substr(ename,1,1)) || ' ' || upper(substr(ename,2)) as "fullname"
from emp;
--- lpad , rpad(채우기)
select lpad('ABC',10,'*') from dual; --lpad 왼쪽에 채운다.
select rpad('ABC',10,'#') from dual; --rpad 오른쪽에 채운다.
------Quiz
--사용자의 비번 : hong1006
--화면 : ho******출력하고 싶다. (만약에 1004이면 10**)
select rpad(substr('hong1006',1,2),9,'*') from dual;
select rpad(substr('hong1006',1,2),length('hong1006'),'*') as "password" from dual;
--emp 테이블에서 ename 컬럼의 데이터 출력하는데 첫글자만 출력하고 나머지는 *출력하세요
select rpad(substr(ename,1,1),length(ename),'*') as "ename" from emp;
create table member2(
id number,
jumin varchar2(14)
);
select * from member2;
insert into member2(id,jumin) values(100,'123456-1234567');
insert into member2(id,jumin) values(200,'234567-1234567');
commit;
--Quiz
--출력결과가 하나의 컬럼으로 100 : 123456-*******
--200 : 234567-*******
--가명칭 : "jumin"
select id || ' : ' || rpad(substr(JUMIN,1,7),length(jumin),'*') as "jumin"
from member2;
-- rtrim 함수 [오른쪽 문자를 지워라] rtrim(정보 , 지워야 하는 것)
-- ltrim 함수 [왼쪽 문자를 지워라] ltrim(정보 , 지워야 하는 것)
select rtrim('MILLER' , 'ER') from dual;
select ltrim('MILLLLLLLLLLER' , 'MIL') from dual; -----주의
-- 치환함수 replace(정보, 바꿀것 , 바꿔지는 것)
select replace('apple','a','h') from dual;
숫자 함수(round, trunc, mod)
-- round(반올림 함수) : round(반올림할 것, 반올림하고 남길 소수점 자리수)
select round(12.345,0) as "r" from dual; --정수부만 남겨라 , 12
select round(12.567,0) as "r" from dual; -- 13
select round(12.345,1) as "r" from dual; -- 12.3
select round(12.567,1) as "r" from dual; -- 12.6
select round(12.345,-1) as "r" from dual; -- 10
select round(15.345,-1) as "r" from dual; -- 20
select round(15.345,-2) as "r" from dual; --0
-- trunc(절삭 함수) :버림 trunc(정보,버리고 남길 자리수)
select trunc(12.345,0) as "r" from dual; -- 12
select trunc(12.567,0) as "r" from dual; -- 12
select trunc(12.345,1) as "r" from dual; -- 12.3
select trunc(12.567,1) as "r" from dual; -- 12.5
select trunc(12.345,-1) as "r" from dual; -- 10
select trunc(15.345,-1) as "r" from dual; -- 10
select trunc(15.345,-2) as "r" from dual; --0
select trunc(12.78978978978978978789,1) as "r" from dual; -- 12.7
select round(12.78978978978978978789,1) as "r" from dual; -- 12.8
-- mod(나누어지는 수, 나누는 수) 나머지 구하는 함수
select mod(12,10) from dual; --2
select mod(0,0) from dual; --0
날짜 함수(sysdate, to_date)
--시스템(웹사이트) 제작 : 날짜 >> sysdate
--게시판 : insert into board(writer , title , content , regdate)
-- values('홍길동' , '방가방가' , '피곤해요', sysdate);
--TIP >> ms-sql >>select getdate()...
select sysdate from dual; -- 날짜를 가져온다.
select hiredate from emp;
desc emp;
--오라클 시스템 정보를 담고 테이블
select*from SYS.NLS_SESSION_PARAMETERS; -- --환경설정 정보
--NLS_DATE_FORMAT >> RR/MM/DD
--NLS_DATE_LANGUAGE >> KOREAN
--NLS_TIME_FORMAT >> HH24:MI:SSXFF
select*from SYS.NLS_SESSION_PARAMETERS where parameter = 'NLS_DATE_FORMAT';
--현재 접속한 사용자(Session)을 기준으로 적용
alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS';
--날짜 형식을 바꾼다. 우리가 원하는 형식으로 사용하는 사용자가 보는 환경에서만 변경, 시스템을 변경한 것이 아니다.
--현재 접속을 해제하고 다시 접속하면 default상태로 복구가 되어있다.
--다른 곳에서 bituser로 다른 사용자가 접속하면 >> 날짜 Format은 default값이다.
select sysdate from dual;
select hiredate from emp;
--Oracle 날짜 표기 : '날짜'
select*from emp
where hiredate = '1980-12-17'; --날짜형식으로 인정
select*from emp
where hiredate = '1980/12/17'; --날짜형식으로 인정
select*from emp
where hiredate = '80-12-17'; --인정이 안된다. YYYY가 아니므로 무조건 형식을 맞추어야 한다.
-- 날짜 연산(POINT) : Date + or - Number >> Date (number는 일로 계산된다)
-- Date - Date >> Number ( 일수가 나온다.)
select*from SYS.NLS_SESSION_PARAMETERS where parameter = 'NLS_DATE_FORMAT';
select sysdate from dual;
select hiredate from emp;
select MONTHS_BETWEEN('2018-02-27','2010-02-27') from dual; --개월의 차 96개월
select round(MONTHS_BETWEEN(sysdate,'2010-01-01'),1) from dual;
select trunc(MONTHS_BETWEEN(sysdate,'2010-01-01'),1) from dual;
select to_date('2015-04-25') + 1000 from dual; --to_date('날짜') >> 문자를 날짜로 바꾸어준다.
--Quiz
/*
1. 사원테이블에서 사원들의 입사일에서 현재 날짜(sysdate) 까지의 근속월수를 구하세요
2. 한달이 31일 이라고 가정하고 근속월수를 구하세요.
*/
select trunc(months_between(sysdate,hiredate),0) as "근속월수"
from emp;
select trunc((sysdate - hiredate)/31,0)
from emp;