3. 단일행 함수


  • 데이터가 여러 건 존재하지만 함수에 들어가는 데이터는 한번에 한개
  • 한번에 하나씩 처리하는 함수
    • select ename, initcap(ename), job, length(job), sal from emp;
  • 복수행 함수 : 여러건의 데이터를 동시에 입력받아 1건의 결과
    • select sum(sal) from emp;

1. 문자함수

  • initcap() : 영문의 첫글자만 대문자로 나머지는 소문자로
    • select initcap(‘preTTy girl’) from dual;
    • Pretty Girl
  • upper() : 전부 대문자로
  • lower() : 전부 소문자로
  • length(),lengthb() : 문자열의 길이,바이트수를 리턴
  • concat(‘’,’’) : 두 문자열을 연결
  • substr(‘문자열’,시작위치, 글자수) : 특정 길이의 문자열 추출
    • substr(‘abcdefghi’,2,3) : bcd
    • substr(‘abcdefghi’,6) : fghi
    • substr(‘abcdefghi`,-5,2) : ef
    • substrb : 바이트수의 문자열 추출
  • instr(‘문자열’,’찾는글자’,시작위치,몇번째인지)
    • instr(‘abc’,’’) : 2
    • instr(‘abc’,’‘,3) : 4
    • instr(‘abc’,’‘,3,2) : 6
  • lpad(‘문자열’, 자리수,’채울문자’) : 왼쪽 빈자리 채우기
  • rpad : 오른쪽 빈자리 채우기
  • ltrim(‘문자열’,’제거할 문자’) : 왼쪽에서 해당 문자 제거
    • 문자 미지정시 공백 제거
  • rtrim : 오른쪽에서 해당 문자 제거
  • reverse() : 문자열을 거꾸로
  • replace(‘문자열, ‘문자1’, ‘문자2’)
    • 문자열에서 문자1이 있으면 문자2로 교체

2. 숫자함수

  • round(숫자, 자리수) : 반올림
    • round(12345.126) : 12345
    • round(12345.126, 1) : 12345.1
    • round(12345.126, 2) : 12345,13
    • round(12345.126, -1) : 12350
    • round(12345.126, -2) : 12300
  • trunc(숫자, 자리수) : 버림
  • mod(숫자, 나누는 수) : 나머지
  • ceil() : 정수로 올림
  • floor() : 정수로 내림
  • power(숫자1, 숫자2) : 숫자1의 숫자2승

3. 날짜함수

  • alter session set NLS_DATE_FORMAT = ‘YYYY-MM-DD HH24:MI:SS’;
    • 포맷형식으로 시스템 날짜 표기방법 변경
  • sysdate : 현재 날짜 시간 리턴
  • sysdate + 숫자
    • 숫자(일) 증가
    • 시간, 분 초 증가 시 일로 변환 후 증가
    • 1/24 + 1/(2460) + 1/(2460*60)
  • add_months(날짜, 숫자)
    • 숫자(월) 만큼 증가
  • to_yminterval()
    • 문자형태를 연,월의 기간 차이로 리턴
    • sysdate + to_tminterval(‘02-04’)
    • 현재 날짜에 2년 4개월 증가
  • to_dsinterval()
    • 문자형태를 일, 시분초의 기간 차이로 리턴
    • sysdate + to_dsinterval(‘1 03:10:20’)
    • 1일 3시간 10분 20초 증가
  • months_between : 날짜 사이의 개월 수
  • next_day(날짜, 숫자) : 돌아오는 숫자(1:일~7:토)의 날짜 리턴
    • select next_day(sysdate, 1) from dual;
    • select next_day(sysdate, ‘월’) from dual;
    • select next_day(sysdate, ‘화요일’) from dual;
  • last_day : 해당 달의 마지막 날짜 리턴
  • round : 정오를 기준으로 반올림
  • trunc : 시간을 버리고 해당 날짜 리턴

4. 형변환함수

  • to_number
    • 문자를 숫자로 형변환
  • to_date
    • 문자를 날짜로 형변환
  • to_char(날짜, 패턴)
    • 숫자와 날짜를 문자로 형변환, 패턴 형식으로 표현
select sysdate, to_char(sysdate, 'yyyy'), --2022
to_char(sysdate, 'mm'), --03
to_char(sysdate, 'dd'), --17
to_char(sysdate, 'd') 요일, --(1:일, 2:월~) 5
to_char(sysdate, 'year'), --twenty twenty-two
to_char(sysdate, 'mon'), --3월 
to_char(sysdate, 'month'), --3월 
to_char(sysdate, 'ddd'), --1년중 며칠인지 076
to_char(sysdate, 'day'), --요일을 한글로 목요일
to_char(sysdate, 'dy'), --요일 목
to_char(sysdate, 'q')--분기 1
from dual;


select sysdate, to_char(sysdate,'yyyy-mm-dd'), --2022-03-17
to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'), --2022-03-17 17:28:56
to_char(sysdate,'yyyy-mm-dd hh:mi:ss am d'), --2022-03-17 05:28:56 오후 5
to_char(sysdate,'yyyy-mm-dd hh:mi:ss pm day') --2022-03-17 05:28:56 오후 목요일
from dual;


  • 9 : 남은 자리를 공백으로
  • 0 : 남은 자리를 0으로
select 1234, to_char(1234,'999999'), --  1234
to_char(1234,'099999'), -- 001234
to_char(1234, '$99999'), --  $1234
to_char(1234,'L99999'), --         ₩1234
to_char(1234.56, '9999.9'), -- 1234.6
to_char(1234, '99,999'), --  1,234
to_char(123456789,'999,999,999'), -- 123,456,789
to_char(1234.56,'9999') -- 1235
from dual;
  • extract() - 날짜에서 년,월,일 추출
select extract(year from sysdate) 년도, --2022
extract(month from sysdate) , --3
extract(day from sysdate)  --17
from dual;

select extract(year from to_date('2023-05-19')) 년도, --2023
extract(month from to_date('2023-05-19')) , --5
extract(day from to_date('2023-05-19'))  --19
from dual;

5. 일반함수

  • 함수의 입력값으로 숫자, 문자, 날짜 구분없이 모두 사용가능한 함수

NVL

  • NVL(컬럼, 치환할 값)
    • null값을 만나면 다른 값으로 치환
select name, bonus, nvl(bonus,0) from professor;

NAME            BONUS NVL(BONUS,0)
---------- ---------- ------------
조인형            100          100
박승곤             60           60
송도권                           0
  • NVL2(col1, col2, col3)
    • col1의 값이 null이 아니면 col2로 출력
    • col1의 값이 null이면 col3으로 출력
select name, pay, bonus, nvl2(bonus,pay*12+bonus,pay*12) from professor;

NAME              PAY      BONUS NVL2(BONUS,PAY*12+BONUS,PAY*12)
---------- ---------- ---------- -------------------------------
조인형            550        100                            6700
박승곤            380         60                            4620
송도권            270                                       3240

DECODE

  • if문을 표현하는 함수

  • A=B일때 1 출력

if a = b then
  return '1';
end if;


decode(a,b,'1',null) -- null은 생략 가능
  • A=B일때 1 출력, 아니면 2출력
if a=b then
  return '1';
else
  return '2';
end if;


decode(a,b,'1','2')
  • a=b일때 1, a=c=일때 2, 아니면 3
if a=b then
  return '1';
elsif a=c then
  return '2';
else
  return '3';
end if;


decode(a, b,'1',
          c,'2',
            '3')
  • a=b이면서 a=c이면 1, 아니면 2, 둘다아니면 3
if a=b then
  if a=c then
    return '1';
  else
    return '2';
  end if
else
  return '3';
end if


decode(a,b, decode(a,c, '1',
                        '2'),
            '3')

CASE

  • if문을 대신하는 함수, 조건이 범위값일 때도 사용 가능
--동일 값 비교시
case when 조건1 then 출력1
    when 조건2 then 출력2
     else 출력3
     end "별칭"
     
--범위 값 비교시
case when 조건1 then 출력1
    when 조건2 then 출력2
    else 출력3
    end "별칭"
  • 동일 값 비교 예
select name, grade,
case grade when 1 then '1학년'
           when 2 then '2학년'
           when 3 then '3학년'
           else '4학년'
           end 학년
from student;

NAME            GRADE 학년 
---------- ---------- ---
서진수              2 2학년
서재수              3 3학년
이미경              4 4학년
  • 범위 값 비교 예
    ```sql select name, pay, case when pay>400 then ‘400초과’ when pay between 300 and 400 then ‘사이’ when pay<300 then ‘300미만’ end 범위 from professor;

NAME PAY 범위
———- ———- —– 조인형 550 400초과 박승곤 380 사이 송도권 270 300미만 ```