KIC/ORACLE

[Oracle] 함수활용

octopengj 2020. 10. 12. 10:16

dual

  • 오라클의 기본적인 테이블로써 일반유저가 사용가능한 테이블

  • 산술 연산이나 가상 칼럼 등의 값을 한번만 출력하고 싶을 때 많이 사용하는 아주 유용한 테이블로서 DUMMY라는 한개의 칼럼으로 구성되어 있다.

형식) desc dual;

select * from dual;

기존의 테이블을 이용=>복잡(기존의 데이터와 섞어서 나옴) 오늘 날짜를 구할때도 사용=>sysdate

SQL> desc dual
 이름                                      널?      유형
 ----------------------------------------- -------- ----------------------------
 DUMMY                                              VARCHAR2(1)

 

 

<문1> select 24*23*12 from dual;

          select sysdate from dual;

SQL> select 24*23*12 from dual;

  24*23*12
----------
      6624
SQL> select sysdate from dual;

SYSDATE
--------
20/07/08

 

함수를 이용 => 계산, 검색

 

형식) select 함수명(처리해야할 값,,,),함수명2(~),,,

        from 테이블명(dual,검색대상테이블,,,)

        where 조건식=>검색하는 방법

 

 

 

 

 

<문2>직원 14명중에서 사원의 이름의 길이가 5개이상인 직원을 검색해서 그 사원의 사번,이름,업무순으로 출력

 

 

    문자길이->length(필드명)=>필드에 적용(레코드 갯수만큼)

                   length("aabbdd")

 

SQL> select empno,ename,job

        from emp

        where length(ename)>=5; //where 함수를 이용 조건체크

SQL> select empno, ename,job from emp where length(ename)>=5;

     EMPNO ENAME      JOB
---------- ---------- ---------
      7369 SMITH      CLERK
      7499 ALLEN      SALESMAN
      7566 JONES      MANAGER
      7654 MARTIN     SALESMAN
      7698 BLAKE      MANAGER
      7782 CLARK      MANAGER
      7788 SCOTT      ANALYST
      7844 TURNER     SALESMAN
      7876 ADAMS      CLERK
      7900 JAMES      CLERK
      7934 MILLER     CLERK

11 개의 행이 선택되었습니다.

 

 

 

<문3>사용자로부터 이름을 입력=>allern,scott

 

SQL> select ename, sal, comm from emp where ename=upper('&ename'); => 대문자로 변환해서 찾기

 

                                                       where lower(ename)='&ename'; => 소문자로 변환해서 찾기

SQL> select ename, sal, comm from emp where ename=upper('&ename');
ename의 값을 입력하십시오: scott
구   1: select ename, sal, comm from emp where ename=upper('&ename')
신   1: select ename, sal, comm from emp where ename=upper('scott')

ENAME             SAL       COMM
---------- ---------- ----------
SCOTT            3000

 

 

 

<문4> 문자열 취급함수->substr(적용문자열,시작위치(1부터),뽑아낼갯수)

 

형식) select substr('abcde',1,2) from dual;

 

SQL> select substr('abcde',1,2) from dual;

SQL> select substr('abcde',1,2) from dual;

SU
--
ab

abcde의 1부터 2개를 출력

 

 

 

 

<문5> emp테이블에서 사원이름의 첫글자가 'K'보다 크고(and), Y'자보다 적은 사원을 검색해서 그 찾은 사원의 사번,

         이름,업무순으로 출력하시오.(단 이름순으로 정렬할것)=>order by ename(오름차순)

 

  • 사원이름의 첫글자가 'K'보다 크고(and) => substr(ename,1,1)>K'

  • Y'자보다 적은 사원 => substr(ename,1,1)<'Y'

select empno,ename,job from emp

where substr(ename,1,1) > 'K' and

substr(ename,1,1) < 'Y'

order by ename;

SQL> select empno,ename,job from emp where substr(ename,1,1) > 'K' and  substr(ename,1,1) < 'Y' order by ename;

     EMPNO ENAME      JOB
---------- ---------- ---------
      7654 MARTIN     SALESMAN
      7934 MILLER     CLERK
      7788 SCOTT      ANALYST
      7369 SMITH      CLERK
      7844 TURNER     SALESMAN
      7521 WARD       SALESMAN

6 개의 행이 선택되었습니다.

 

 

<문6> 문자열 검색중에서 특정문자가 어디에 위치하는지 알고싶다.?

 

형식) instr(적용대상문자열,찾고자하는 문자열)=>위치 번호를 알려준다.

 

 

sql>select ename,instr(ename,'O') =>자바에서는 indexOf

      from emp;

 

SQL> select ename,instr(ename,'O') from emp;

ENAME      INSTR(ENAME,'O')
---------- ----------------
SMITH                     0  // 찾는 위치를 모름(없음)
ALLEN                     0
WARD                      0
JONES                     2  // 문자열중에서 2번째 위치에 O가 있다.
MARTIN                    0
BLAKE                     0
CLARK                     0
SCOTT                     3  // 문자열 중에서 3번째 위치에 O가 있다.
KING                      0
TURNER                    0
ADAMS                     0

ENAME      INSTR(ENAME,'O')
---------- ----------------
JAMES                     0
FORD                      2
MILLER                    0

14 개의 행이 선택되었습니다.

중첩함수=>함수 내부에 또 다른 함수가 있는 경우 실행하는 순서는 내부함수부터 시작

 

SQL> select ename,instr(ename,upper('o')) from emp;

 

 

 

<문7>숫자함수->계산,반올림,내림,,,=>round,trunc

 

  •  

    round

    select round(4567.678),round(4567.678,0),

            round(4567.678,2),

            round(4567.678,-2) from dual;

     

SQL> select round(4567.678),round(4567.678,0),round(4567.678,2), round(4567.678,-2) from dual;

ROUND(4567.678) ROUND(4567.678,0) ROUND(4567.678,2) ROUND(4567.678,-2)
--------------- ----------------- ----------------- ------------------
           4568              4568           4567.68               4600

=>반올림 자리수(양수)->소수점 자리수 계산

                       (음수)->소수점 바로 앞의 자리수를 가지고 계산

                       반이상 ->반올림

 

 

  • trunc

    • 소수점을 잘라내는 함수(=절삭)

    • 소수점의 자리수에 맞춰서 잘라내는 함수

SQL> select trunc(4567.678),trunc(4567.678,0),trunc(4567.678,2), trunc(4567.678,-2) from dual;

TRUNC(4567.678) TRUNC(4567.678,0) TRUNC(4567.678,2) TRUNC(4567.678,-2)
--------------- ----------------- ----------------- ------------------
           4567              4567           4567.67               4500

 

 

  •  

    mode, sign

     

    • mod함수 => 나머지 구해주는함수

    • sign함수 => 양수(1),음수(-1),0일때 0을 반환

SQL> select mod(10,3),sign(100),sign(-100),sign(0) from dual;

 MOD(10,3)  SIGN(100) SIGN(-100)    SIGN(0)
---------- ---------- ---------- ----------
         1          1         -1          0

 

 

 

<문8> sqlplus 중에서 보고서에 관련된 명령어

 

null =>데이터가 저장되지 않은 상태 , 눈에 X => not null (데이터를 반드시 입력하라)

' ' =>데이터가 저장, 눈에 O

 

 

SQL> desc dept //부서테이블

SQL> desc dept;
 이름                                      널?      유형
 ----------------------------------------- -------- ----------------------------
 DEPTNO                                    NOT NULL NUMBER(2)
 DNAME                                              VARCHAR2(14)
 LOC                                                VARCHAR2(13)

SQL> select * from dept;

SQL> select * from dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

 

-컬럼 길이 설정

형식) col[umn] 적용필드명 format 길이(an)

SQL> col dname format a8; // 8글자로 설정하겠다.(exit-> 다시 로그인하면 자동해제 된다.)

SQL> col dname format a8;
SQL> /

    DEPTNO DNAME    LOC
---------- -------- -------------
        10 ACCOUNTI NEW YORK
           NG

        20 RESEARCH DALLAS
        30 SALES    CHICAGO
        40 OPERATIO BOSTON
           NS

 

 

 

<문9> 적용시킨 필드의 값을 원래상태로 되돌리기(=초기화)

 

형식) col[umn] 해제시킬 필드명 clear

SQL> col dname clear;

SQL> col dname clear
SQL> /

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

 

 

 

<문10> 가상필드도 설정이 가능

=> e_name, e_empno

 

SQL> col e_name format a23

SQL> col e_empno format a15

 

 

SQL> select empno,ename,

        concat(empno,ename) e_name,

         concat(ename,empno) e_empno

         from emp

         where deptno=&deptno;

 

SQL> col e_name format a23
SQL> col e_empno format a15
SQL> select empno,ename,
  2  concat(empno,ename) e_name,
  3  concat(ename,empno) e_empno
  4  from emp
  5  where deptno=&deptno;
deptno의 값을 입력하십시오: 10
구   5: where deptno=&deptno
신   5: where deptno=10

     EMPNO ENAME      E_NAME                  E_EMPNO
---------- ---------- ----------------------- ---------------
      7782 CLARK      7782CLARK               CLARK7782
      7839 KING       7839KING                KING7839
      7934 MILLER     7934MILLER              MILLER7934

 

 

 

<문11>파라미터 인수질의 &deptno, '&deptno' emp테이블에서 사원번호는 반드시 출력하고,나머지 필드는 동적으로 입력받아서 출력하시오. (단 조건식도 동적으로 입력받을것)

 

형식) where 조건식=>&필드명, '&필드명'

 

        select &필드명

        from &필드명

        where 조건=>&필드명

 

 

SQL> select empno,&column_name
  2   from emp
  3   where &condition;
column_name의 값을 입력하십시오: ename, sal, job
구   1: select empno,&column_name
신   1: select empno,ename, sal, job
condition의 값을 입력하십시오: ename like '%L%'
구   3:     where &condition
신   3:     where ename like '%L%'

     EMPNO ENAME             SAL JOB
---------- ---------- ---------- ---------
      7499 ALLEN            1600 SALESMAN
      7698 BLAKE            2850 MANAGER
      7782 CLARK            2450 MANAGER
      7934 MILLER           1300 CLERK

 

 

 

<문12>lpad->특정문자열을 왼쪽으로 기준점설정=>지정한 특수기호를 출력

          ,rpad,replace함수

 

emp테이블에서 ename=>lpad(출력대상자문자열,자릿수,특수기호)

사번,이름,급여만 출력(단 부서번호는 20번인 데이터만 출력할것)

 

select empno,ename,lpad(ename,10,'*'),

sal,rpad(sal,10,'#')

from emp

where deptno=20;

SQL> select empno,ename,lpad(ename,10,'*'), sal,rpad(sal,10,'#') from emp where deptno=20;

     EMPNO ENAME      LPAD(ENAME,10,'*')          SAL RPAD(SAL,10,'#')
---------- ---------- -------------------- ---------- --------------------
      7369 SMITH      *****SMITH                  800 800#######
      7566 JONES      *****JONES                 2975 2975######
      7788 SCOTT      *****SCOTT                 3000 3000######
      7876 ADAMS      *****ADAMS                 1100 1100######
      7902 FORD       ******FORD                 3000 3000######

replace(적용필드명,변경전문자열,변경후문자열)->emp =>실제 물리적변경X , 가상으로 보여주는 역할

 

 

 

 

<문13>replace함수

 

SQL> select ename,replace(ename,'A','$') as "Change Name"

         from emp;

SQL> select ename,replace(ename,'A','$') as "Change Name"
  2        from emp;

ENAME      Change Nam
---------- ----------
SMITH      SMITH
ALLEN      $LLEN
WARD       W$RD
JONES      JONES
MARTIN     M$RTIN
BLAKE      BL$KE
CLARK      CL$RK
SCOTT      SCOTT
KING       KING
TURNER     TURNER
ADAMS      $D$MS

ENAME      Change Nam
---------- ----------
JAMES      J$MES
FORD       FORD
MILLER     MILLER

14 개의 행이 선택되었습니다.

날짜함수 => 계산 => 날짜 + 숫자 => 더한 날짜

                             날짜 - 숫자 = 뺀날짜

                             날짜 - 날짜 = 일수

 

 

 

 

<문14> emp테이블에서 각 사원들의 근무일수(오늘날짜-입사일)

                                     ->months_between

 

-> 사원명,입사일,근무일수 순으로 출력 (단, 부서번호는 10번 부서)

-> 근무일수가 제일 많은순으로 정렬? (내림차순)

 

 

SQL> select ename,hiredate,

        months_between(sysdate,hiredate) 근무일수

        from emp

        where deptno=&deptno

        order by 근무일수 desc;

SQL> select ename,hiredate,
  2  months_between(sysdate,hiredate) 근무일수
  3  from emp
  4  where deptno=&deptno
  5  order by 근무일수 desc;
deptno의 값을 입력하십시오: 10
구   4: where deptno=&deptno
신   4: where deptno=10

ENAME      HIREDATE   근무일수
---------- -------- ----------
CLARK      81/06/09        469
KING       81/11/17 463.764008
MILLER     82/01/23  461.57046

 

round 적용

SQL> ed
file afiedt.buf(이)가 기록되었습니다

  1  select ename,hiredate,
  2  round(months_between(sysdate,hiredate)) 근무일수
  3  from emp
  4  where deptno=&deptno
  5* order by 근무일수 desc
SQL> /
deptno의 값을 입력하십시오: 20
구   4: where deptno=&deptno
신   4: where deptno=20

ENAME      HIREDATE   근무일수
---------- -------- ----------
SMITH      80/12/17        475
JONES      81/04/02        471
FORD       81/12/03        463
SCOTT      87/04/19        399
ADAMS      87/05/23        398

 

 

 

<문15>add_months(날짜,개월수)->지정 날짜 개월수를 더한 날짜

 

emp테이블에서 입사일 기준 10개월후의 날짜를 계산 (hiredate)

 

(단 sal이 2000 이상인 사원들만 출력->이름,급여,10개월후 순으로 출력)

 

 

SQL> select ename,sal,hiredate,

        add_months(hiredate,10) "10개월 후"

        from emp

        where sal>=2000;

 

 

hiredate

SQL> select ename,sal,hiredate,
  2  add_months(hiredate,10) "10개월 후"
  3  from emp
  4  where sal>=2000;

ENAME             SAL HIREDATE 10개월
---------- ---------- -------- --------
JONES            2975 81/04/02 82/02/02
BLAKE            2850 81/05/01 82/03/01
CLARK            2450 81/06/09 82/04/09
SCOTT            3000 87/04/19 88/02/19
KING             5000 81/11/17 82/09/17
FORD             3000 81/12/03 82/10/03

 

sysdate

SQL> ed
file afiedt.buf(이)가 기록되었습니다

  1  select ename,sal,sysdate,
  2  add_months(sysdate,10) "10개월 후"
  3  from emp
  4* where sal>=2000
SQL> /

ENAME             SAL SYSDATE  10개월
---------- ---------- -------- --------
JONES            2975 20/07/09 21/05/09
BLAKE            2850 20/07/09 21/05/09
CLARK            2450 20/07/09 21/05/09
SCOTT            3000 20/07/09 21/05/09
KING             5000 20/07/09 21/05/09
FORD             3000 20/07/09 21/05/09

6 개의 행이 선택되었습니다.

 

 

 

<문16> next_day(지정한 날짜,'요일') => 지정한 요일에 해당하는 날짜구하기

                                                => 월요일,화요일,,, -> 내부적으로 숫자

 

일(1), 월(2), 화(3), 수(4), 목(5), 금(6), 토(7)

 

SQL> select deptno,ename,hiredate,

        next_day(hiredate,'금요일') =>요일에 해당되는 날짜를 이용해서 특정날짜의 요일을 구하는 경우

        from emp;

 

SQL> select deptno, ename, hiredate, next_day(hiredate, '금요일') from emp;

    DEPTNO ENAME      HIREDATE NEXT_DAY
---------- ---------- -------- --------
        20 SMITH      80/12/17 80/12/19
        30 ALLEN      81/02/20 81/02/27
        30 WARD       81/02/22 81/02/27
        20 JONES      81/04/02 81/04/03
        30 MARTIN     81/09/28 81/10/02
        30 BLAKE      81/05/01 81/05/08
        10 CLARK      81/06/09 81/06/12
        20 SCOTT      87/04/19 87/04/24
        10 KING       81/11/17 81/11/20
        30 TURNER     81/09/08 81/09/11
        20 ADAMS      87/05/23 87/05/29

    DEPTNO ENAME      HIREDATE NEXT_DAY
---------- ---------- -------- --------
        30 JAMES      81/12/03 81/12/04
        20 FORD       81/12/03 81/12/04
        10 MILLER     82/01/23 82/01/29

14 개의 행이 선택되었습니다.

금요일 입력대신 6으로 입력해도 같은 결과가 나온다.

SQL> select deptno, ename, hiredate, next_day(hiredate, 6) from emp;

    DEPTNO ENAME      HIREDATE NEXT_DAY
---------- ---------- -------- --------
        20 SMITH      80/12/17 80/12/19
        30 ALLEN      81/02/20 81/02/27
        30 WARD       81/02/22 81/02/27
        20 JONES      81/04/02 81/04/03
        30 MARTIN     81/09/28 81/10/02
        30 BLAKE      81/05/01 81/05/08
        10 CLARK      81/06/09 81/06/12
        20 SCOTT      87/04/19 87/04/24
        10 KING       81/11/17 81/11/20
        30 TURNER     81/09/08 81/09/11
        20 ADAMS      87/05/23 87/05/29

    DEPTNO ENAME      HIREDATE NEXT_DAY
---------- ---------- -------- --------
        30 JAMES      81/12/03 81/12/04
        20 FORD       81/12/03 81/12/04
        10 MILLER     82/01/23 82/01/29

14 개의 행이 선택되었습니다.

 

 

 

<문17>last_day(지정한 날짜)=>지정한 날짜의 월의 마지막 날짜를 계산 =>윤년,평년으로 자동으로 계산

 

emp테이블에서 입사한 달의 근무일수를 계산?(5일,토,일->포함)

사원명이 두번째 글자가 A인 사원찾기

=> 근무일수가 많은 순으로 정렬(이름,입사일,근무일수 순으로 출력)

 

SQL> select ename,hiredate,

        last_day(hiredate)-hiredate "근무일수"

        from emp

        where ename like '_A%'

        order by 3 desc; // 3은 3번째 열을 기준으로 정렬하라는 의미

SQL> select ename, hiredate, last_day(hiredate)-hiredate "근무일수" from emp where ename like '_A%' order by 3 desc;

ENAME      HIREDATE   근무일수
---------- -------- ----------
JAMES      81/12/03         28
WARD       81/02/22          6
MARTIN     81/09/28          2

 

오라클의 변환함수=>변환(문자,숫자) => 문자 -> 숫자 숫자 -> 문자,날짜

to_date 문자 -> 날짜형으로 변경(X) to_number 문자 -> 숫자로 변경(X)

to_char 날짜,숫자 -> 문자로 변경(O) => 잘 사용하는 경우(출력양식) 2020-07-01 => 20/07/01

 

 

 

 

<문18>emp테이블에서 20번 부서에 근무하는 사원의 급여앞에 $를 표시하고 3자리마다 ,를 표시해서 출력하는 SQL구문을 작성? (사번,이름,급여,출력서식)

 

 

sal -> 2370 -> $2,300 => to_char(적용대상필드,출력서식)

숫자의 자리수 -> 0 또는 9를 사용

 

 

 

SQL> select empno,ename,sal,to_char(sal,'$999,999')

        from emp                              ₩표시할때 => $ 대신에 대문자 L

        where deptno=20

        order by sal desc;

SQL> select empno, ename, sal, to_char(sal,'$999,999') from emp where deptno=20 order by sal desc;

     EMPNO ENAME             SAL TO_CHAR(S
---------- ---------- ---------- ---------
      7788 SCOTT            3000    $3,000
      7902 FORD             3000    $3,000
      7566 JONES            2975    $2,975
      7876 ADAMS            1100    $1,100
      7369 SMITH             800      $800

SQL> select empno, ename, sal, to_char(sal,'L999,999') from emp where deptno=20 order by sal desc;

     EMPNO ENAME             SAL TO_CHAR(SAL,'L999,
---------- ---------- ---------- ------------------
      7788 SCOTT            3000            ₩3,000
      7902 FORD             3000            ₩3,000
      7566 JONES            2975            ₩2,975
      7876 ADAMS            1100            ₩1,100
      7369 SMITH             800              ₩800

숫자,날짜=>내가 원하는 출력양식으로 출력->to_char( ) HH=>12시간 HH24->24시간 표시

select to_char(sysdate,'YYYY/MM/DD, HH24:MI:SS') from dual;   

TO_CHAR(SYSDATE,'YYY
--------------------
2020/07/01, 15:16:46

 

 

 

<문19> 일반함수 nvl함수 => null값을 어떤 특정한 값으로 변환시킬때 사용하는 함수

 

형식) nvl(null값이 포함된 필드명,변경시킬 값)

 

 

       emp=>comm(값 O, 값 X (null값))

 

 

SQL> select ename,sal,comm from emp;

SQL>  select ename,sal,comm from emp;

ENAME             SAL       COMM
---------- ---------- ----------
SMITH             800
ALLEN            1600        300
WARD             1250        500
JONES            2975
MARTIN           1250       1400
BLAKE            2850
CLARK            2450
SCOTT            3000
KING             5000
TURNER           1500          0
ADAMS            1100

ENAME             SAL       COMM
---------- ---------- ----------
JAMES             950
FORD             3000
MILLER           1300

14 개의 행이 선택되었습니다.

 

SQL> select ename,sal,comm,nvl(comm,0) from emp;

SQL> select ename,sal,comm,nvl(comm,0) from emp;

ENAME             SAL       COMM NVL(COMM,0)
---------- ---------- ---------- -----------
SMITH             800                      0
ALLEN            1600        300         300
WARD             1250        500         500
JONES            2975                      0
MARTIN           1250       1400        1400
BLAKE            2850                      0
CLARK            2450                      0
SCOTT            3000                      0
KING             5000                      0
TURNER           1500          0           0
ADAMS            1100                      0

ENAME             SAL       COMM NVL(COMM,0)
---------- ---------- ---------- -----------
JAMES             950                      0
FORD             3000                      0
MILLER           1300                      0

14 개의 행이 선택되었습니다.

emp필드의 comm칼럼에 값이 있으면 그 값을 나타내고, 값이 없으면 null값이 나오는데 그 값을 어느 특정한 값(0)으로 변환 시켰다.

 

 

 

 

 

<문20>

형식) nvl2(null값을 체크할 필드명,인수1,인수2)

        => null이 아닌경우(값이 있으면) -> 인수1선택

        => null을 만나게 되면 => 인수2를 선택 -> 적용

        => 삼항연산자와 비슷한 기능

 

 

sal,comm

800 0=>800 =>보너스가 없으면 총급여(급여만 계산)

900 40=>940 =>보너스가 있으면 총급여(급여+보너스)

SQL> select ename,sal,comm,nvl2(comm,comm+sal,sal) from emp;

ENAME             SAL       COMM NVL2(COMM,COMM+SAL,SAL)
---------- ---------- ---------- -----------------------
SMITH             800                                800
ALLEN            1600        300                    1900
WARD             1250        500                    1750
JONES            2975                               2975
MARTIN           1250       1400                    2650
BLAKE            2850                               2850
CLARK            2450                               2450
SCOTT            3000                               3000
KING             5000                               5000
TURNER           1500          0                    1500
ADAMS            1100                               1100

ENAME             SAL       COMM NVL2(COMM,COMM+SAL,SAL)
---------- ---------- ---------- -----------------------
JAMES             950                                950
FORD             3000                               3000
MILLER           1300                               1300

14 개의 행이 선택되었습니다.

 

 

 

 

<문21> 부서별로 매출에 따라서 급여를 올려줄려고 한다.

 

ANALYST -> 급여 => 10%

CLERK -> 급여 => 15%

MANAGER -> 급여 => 20%

 

공식 -> 다중 if문 -> 각각의 조건에 따른 계산식을 적용

           Decode함수 또는 case when구문을 이용해서 계산

 

형식) decode (적용시킬 필드명(job),조건식(분석가,,),계산값,

                                              조건식2,계산값2,,,

                                              디폴트값)

 

sql>select ename,job,sal,decode(job,'ANALYST',salx1.1,

                                          'CLERK',sal*1.15,

                                          'MANAGER',salx1.2,sal) "급여인상액"

SQL> select ename, job, sal, decode(job,'ANALYST',sal*1.1,'CLERK',sal*1.15,'MANAGER',sal*1.2,sal) "급여 인상액" from emp order by sal desc;

ENAME      JOB              SAL 급여인상액
---------- --------- ---------- ----------
KING       PRESIDENT       5000       5000
FORD       ANALYST         3000       3300
SCOTT      ANALYST         3000       3300
JONES      MANAGER         2975       3570
BLAKE      MANAGER         2850       3420
CLARK      MANAGER         2450       2940
ALLEN      SALESMAN        1600       1600
TURNER     SALESMAN        1500       1500
MILLER     CLERK           1300       1495
WARD       SALESMAN        1250       1250
MARTIN     SALESMAN        1250       1250

ENAME      JOB              SAL 급여인상액
---------- --------- ---------- ----------
ADAMS      CLERK           1100       1265
JAMES      CLERK            950     1092.5
SMITH      CLERK            800        920

14 개의 행이 선택되었습니다.

decode함수와 동일한 기능

형식) case 적용대상필드명 when 조건식 then 결과1

                                   when 조건식 then 결과2

                                    ...

                                    else 결과 n

        end

=>하나의 테이블가지고 검색하는 방법(연산자,함수를 이용)