728x90
반응형

Function


오라클에 내장되어 있는 함수 
값(인자=파라미터)전달 호출 → 작업 수행 → 결과값 리턴 (오라클은 무조건 값을 리턴함)


함수 종류


1. 단일행 처리 함수 : 행단위로 실행되는 함수(행마다 한 번 씩 실행되기에 결과값도 행 갯수와 같음)
    a. 문자처리 함수
    b. 숫자처리 함수
    c. 날짜처리 함수
    d. 형변환 함수 *확실히 알아두기*
    e. 기타 함수
2. 그룹함수(다중행 처리 함수) : 여러행을 그룹지어 처리하는 함수

 

 

1. 단일행 처리함수

a. 문자처리 함수

length(문자열)
문자열의 길이를 리턴

select email, 
       length(email),  --가상컬럼으로 매행마다 결과값 리턴(단일행 함수) 
       lengthb(email), 
       emp_name, 
       length(emp_name), 
       lengthb(emp_name) 
from employee; 

select * 
from employee 
where length(email) > 15; 


instr(string, search[, position[, occurence]])  →indexOf와 비슷
stirng에서 search문자열의 인덱스를 리턴
position : 검색 시작위치
1-based index를 사용(자바와 다름!!!!!! 0부터 X)

select instr('바나나맛우유 딸기맛우유 초코맛우유', '우유'),     --여기서 우유라는 글자가 몇번째에 위치하냐 
       instr('바나나맛우유 딸기맛우유 초코맛우유', '우유', 5, 2),  --검색을 시작할 position정해줄 수 있음(5부터 검색해서 2번째 출연한 정보 조회) 
       instr('바나나맛우유 딸기맛우유 초코맛우유', '우유', -1)  --position값이 음수이면 뒤에서부터 검색 lastIndexOf와 비슷 
from dual; 


예제)email의 @의 위치를 표시하기

select email, 
       instr(email, '@')     --email에서 @의 위치가 어디인지 숫자로 출력
from employee; 


lpad(string, width [, padding])  → 대괄호는 옵션으로 생략 가능하다는 의미
주어진 길이의 문자열을 반환. 남는 영역은 padding 문자를 채움
padding 문자 기본값은 공백

select lpad(email, 20, '#'),  --20바이트가 모자라면 padding문자가 모자라는 갯수만큼 왼쪽으로 추가 
        rpad(email, 20, '#'),  --패딩문자 오른쪽으로 채움 
        lpad(email, 20), 
        rpad(email, 20) 
from employee;

rpad 

문자열을 지정된 숫자만큼의 크기로 설정하고, 지정한 문자를 오른쪽부 터 채워서 생성된 문자열을 리턴

 

rtrim

왼쪽부터 지정한 문자를 잘라내고 남은 문자를 리턴

select rtrim(email, '@naver.com')    --네이버 메일의 아이디만 출력
from employee;

 

ltrim

오른쪽부터 지정한 문자를 잘라내고 남은 문자를 리턴

 

trim

왼쪽/오른쪽/양쪽부터 지정한 문자를 잘라내고 남은 문자를 리턴


substr(string, position[, length])
지정문자열에서 시작위치부터 몇개의 문자를 잘라내여 반환 (substring비슷)

select substr('showmethemoney', 5, 2), 
       substr('showmethemoney', 5), 
       substr('showmethemoney', -10, 2)  --뒤에서부터 세어서 뒤로 두글자 
from dual; 

substrb

지정한 위치에서 지정한 바이트만큼 문자를 잘라내어 리턴

 

lower

전달받은 문자/문자열을 소문자로 변환하여 리턴

 

upper

전달받은 문자/문자열을 대문자로 변환하여 리턴 

select upper(email) --메일주소가 oracle.@naver.com 이라면 ORACLE@NAVER.COM출력
from employee;

 

initcap

전달받은 문자/문자열의 첫 글자를 대문자로, 나머지 글자는 소문자로 변환하여 리턴

select initcap(email) --메일주소가 oracle.@naver.com 이라면 Oracle@Naver.Com출력
from employee;

 

 

concat

인자로 전달받은 두 개의 문자/문자열을 합쳐서 리턴

select concat('oracle', '@naver.com')   --oracle@naver.com 출력
from employee;

 

 

replace

전달받은 문자열중에 지정한 문자를 인자로 전달받은 문자로 변환하여 리턴

select replace(emp_no, substr(emp_no,9,6), '******') → 890101-2*******
from employee;


예제)사원테이블에서 사원명중 성만 추출해서 중복없이 오름차순으로 조회하기

select distinct substr(emp_name, 1, 1) 성 
from employee 
order by 성;  --order by문법중 하나 

replace(string, str1, str2) str1 을 str2로 바꿔라 
select email,

        replace(email, 'gmail.com' 'www.naver.com')

from employee;

 

b. 숫자처리함수
mod(number, division)  : 자바의 %연산자 대신 사용

select mod(10,3),      --1출력
       mod(10,2)       --0출력
from dual; 


ceil | floor : 올림버림 함수

select ceil(123.456),              --124
       floor(123.456),             --123
       ceil(123.456*100)/100,      --123.46
       floor(123.456*100)/100      --123.45
from dual; 


round(number, position)  : 반올림

select round(123.456, 2),       --123.46
       round(123.456),          --123
       round(123.456, -1)       --120
from dual;

 
trunc(number, position)
숫자/날짜에 대해 버림기능

select trunc(123.456, 2),    --123.45
       trunc(123.456),       --123
       trunc(123.456, -1)    --120
from dual; 


c. 날짜처리 함수
sysdate, systimestamp

select sysdate,                                         --20/05/13
       to_char(sysdate, 'yyyy/mm/dd hh24:mi:ss'),       --2020/05/13 17:52:51
       to_char(sysdate-1, 'yyyy/mm/dd hh24:mi:ss'),     --2020/05/12 17:52:51
       to_char(sysdate+1, 'yyyy/mm/dd hh24:mi:ss'),     --2020/05/14 17:52:51
       systimestamp                                     --20/05/13 17:52:51.343000000 +09:00
from dual;


add_months(date, number)
number 개월수를 의미함

select sysdate,                     
       add_months(sysdate, 1)       --20/06/13
from dual; 


months_between(date1, date2)  → 2개의 개월수 차이 반환
크리스마스로부터 남은 개월수 확인

select to_date('2020/12/25', 'yyyy/mm/dd') 크리스마스,  -- 날짜타입으로 명시적으로 변환하는 방법 
        months_between(to_date('2020/12/25', 'yyyy/mm/dd'), sysdate) "남은 개월수",  --소수점은 trunc를 이용해서 잘라주기 
        trunc(months_between(to_date('2020/12/25', 'yyyy/mm/dd'), sysdate),1) "남은 개월수" 
from dual; 


extract(type from date)
특정정보만 추출해서 숫자형으로 반환

select extract(year from sysdate) yyyy,  
       extract(month from sysdate) mm, 
       extract(day from sysdate) dd, 
       extract(hour from cast(sysdate as timestamp)) hh,  --sysdate를 timestamp형식으로 변환 
       extract(minute from cast(sysdate as timestamp)) mi, 
       extract(second from cast(sysdate as timestamp)) ss 
from dual;

 
예제)입사일에서 년월일정보 추출

select extract(year from hire_date)||'년'|| 
       extract(month from hire_date)||'월'|| 
       extract(day from hire_date)||'일' 
from employee; 


예제)2001년 입사자의 사원명, 입사일 조회

select emp_name, 
       hire_date 
from employee 
where extract(year from hire_date) = 2001; 


trunc(date[, type])
날짜정보의 시분초를 제외하고 가져올 수 있음

select to_char(sysdate, 'yyyy/mm/dd hh24:mi:ss'), 
       to_char(trunc(sysdate), 'yyyy/mm/dd hh24:mi:ss'),  --요걸 제일 자주 사용 
       to_char(trunc(sysdate, 'month'), 'yyyy/mm/dd hh24:mi:ss')  --month값 초기화(해당달의 1일로 초기화) 
from dual; 


*****d. 형변환함수 
/*
        th_char        to_date
        -------->      ------->
    number      string       date
         <-------      <-------
       to_number     to_char
*/


to_char(date | number, format)

날짜형 혹은 숫자형을 문자형으로 반환
format model

참고 사이트 : www.docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements004.htm#SQLRF00216

fm : 포맷팅으로 생겨난 0, 공백등을 제거함

select to_char(sysdate, 'yyyy/mm/dd(dy) hh24:mi:ss'), 
       to_char(sysdate, 'yyyy/mm/dd(day) hh24:mi:ss'), 
       to_char(sysdate, 'fmyyyy"년" mm"월" dd"일"(day)')  --한글등은 쌍따옴표로 감싸 처리할 것 
from dual; 
select to_char(hire_date, 'yy/mon, day, dy')   -- 01/9월 , 토요일, 토
       to_char(number, [format])
	   to_char(salary, 'fmL999,999,999,999')   --₩8,000,000
	   to_char(salary, '000,000,000,000')      --000,008,000,000
from employeee;


예제)fm을 사용하여 세자리마다 콤마찍기
제공된 숫자보다 충분히 큰 포맷팅을 해야함!!
0 : 해당자릿수에 숫자가 존재하지 않으면 0으로 표시, 소수점 이하는 0으로 표시
9 : 해당자릿수에 숫자가 존재하지 않으면 공백으로 표시, 소숫점 이하는 0으로 표시

select to_char(1234567890, 'fmL999,999,999,999'),  --지역화폐표시 l,L --금액표시 이런식으로 많이 함 
       to_char(1234567890, '000,000,000,000'), 
       to_char(1234567890, '9,999')  --충분히 큰 포맷 모델 자릿수를 제공할 것 
from dual; 


to_number

문자형을 숫자형으로 반환
₩1,234,567,890를 숫자로 변환하기 

select to_number('₩1,234,567,890', 'L999,999,999,999')+10,   --1234567900
       '12345678'+100,                                        --12345778(자동형변환 가능)  
       to_number('10,000', '999,999')                         --10000
from dual;


to_date(string, format)
문자형 혹은 숫자로 쓰인 날짜 데이터를 날짜 타입으로 변환

select to_date('2020/02/02', 'yyyy/mm/dd')+1,     --20/02/02
	   to_date(20200202, 'yyyymmdd')              --20/02/02
from dual; 


2000년도 이후 입사자의 사번, 사원명, 입사일 조회(입사일 내림차순 정렬)

select to_date('2000', 'yyyy'), 
       trunc(to_date('2000', 'yyyy'),'year') 
from dual; 

select emp_id, 
       emp_name, 
       hire_date 
from employee 
where extract(year from hire_date) >= 2000  --hire_date > '2000/01/01'도 가능   => to_date('2000/01/01', 'yyyy/mm/dd') 
order by 3 desc;

 
날짜 연산
1일 2시간 3분 4초뒤를 날짜타입으로 조회

select to_char((sysdate+1) + (1/24*2) + (1/24/60*3) + (1/24/60/60*4), 'yyyy/mm/dd hh24:mi:ss'), 
       to_char((sysdate+1) + (2/24) + (3/24/60) + (4/24/60/60), 'yyyy/mm/dd hh24:mi:ss') 
from dual; 


e.기타함수

null 처리 함수
nvl(col, val) | nvl2(col, val1, val2)
col값이 null이 아니라면, val1을 리턴, null이라면, val2를 리턴 (유무에 따라 출력 필요한 경우 사용)

select nvl2('abc', 0, 1),          --0
       nvl2(null, 0,1)             --1
from dual; 

select emp_name, 
       (salary + (salary * nvl(bonus, 0))) * 12 "연봉계산 예시",  
       nvl2(bonus, '보너스 있음', '보너스 없음') 보너스유무 
from employee; 

조건함수
***decode(표현식, 값1, 결과값1, 값2, 결과값2, .......[, default]) 
성별 구분 

select emp_name, 
       emp_no, 
       substr(emp_no, 8,1), --1은 몇글자 가져올지 
       decode(substr(emp_no, 8,1), '1', '남', '2', '여', '3', '남', '4', '여') 성별,  --첫번째 표현식 검사 
       decode(substr(emp_no, 8,1), '1', '남', '3', '남', '여') 성별  --switch문처럼 생각하기 1과 3에 해당X면 기본값 여 
from employee; 


***case 
사용법1(decode처럼 사용)

case 표현식 
    when 값1 then 결과값1 
    when 값2 then 결과값2 
    else 기본값 
end  --반드시 적어야함

 

사용법2

case 
    when 조건식1 then 결과값1 
    when 조건식2 then 결과값2 
    ... 
    else 기본값 
end 

case 예시

select emp_name, 
       case substr(emp_no, 8,1) 
            when '1' then '남' 
            when '3' then '남' 
            else '여'   --생략시 null 
       end 성별, 
        
       case 
            when substr(emp_no, 8, 1) = '1' then '남' 
            when substr(emp_no, 8, 1) = '3' then '남' 
            else '여' 
        end 성별, 
         
        case 
            when substr(emp_no, 8, 1) in ('1','3') then '남' 
            else '여' 
        end 성별 
from employee;

 

2. 다중행 처리 함수(그룹함수)

하나 이상의 행을 그룹으로 묶어 연산하여 총합, 평균 등을 하나의 컬럼으로 리턴

 

sum

그룹의 누적 합계를 리턴

 

avg

그룹의 평균을 리턴

 

count

그룹의 총 개수를 리턴

 

max

그룹의 최대값을 리턴

 

min

그룹의 최소값을 리턴

반응형

'프로그래밍 > SQL' 카테고리의 다른 글

05.18(join)  (0) 2020.05.18
05.15(union, union all, intersect, minus)  (0) 2020.05.15
05.14(group by & having)  (0) 2020.05.14
05.12(SQL기본 구문 select, where, order by)  (0) 2020.05.12
05.11(SQL)  (0) 2020.05.11
복사했습니다!