ORACLE

 

1.null값 처리함수

 

1)nvl :null값을 포함하는 컬럼을 특정한 값으로 전환하는 함수

 

-- 형식 : nvl(null값을 포함하고 있는 컬럼이나 식, 전환하고자 하는 목표값)


(문제) emp 테이블에서 사원의 이름, 직책, 커미션(수당) 을 나타내시오.

단, 커미션이 없는 사원은 3%의 커미션을 적용하시오.

 

-- nvl(A, B) A가 null 이면 B, null 이 아니면 A

select ename, deptno, sal*nvl(comm, 3)/100 커미션 from emp;


>>출력

김철수    20    6
이찬수    30    780
박종수    30    1625
임채호    20    14.91
나대호    30    4550
박지성    30    14.55
구자철    10    13.35
송기성    20    15
김철호    10    24
성명준    30    0
황인태    20    6.3
박민성    30    8.85
박진성    20    18
최철호    10    6.9


-- nvl2(A, B, C) 가 null 이 아니면 B, null 이면 C

 

 

2)nvl2 : null 값인 경우와 아닌 경우 모두 특정 값으로 변환하는 함수

-- 형식 : nvl2(null값을 포함하고 있는 컬럼이나 식, null 이 아닌 경우의 값, null인 경우의 값)


(문제) emp 테이블에서 커미션이 원래 있는 직원은 5%를 적용하고 없던 직원은 3%를 적용하여

특별보너스를 계산하시오

select ename, deptno, sal*nvl2(comm, 5, 3)/100 커미션 from emp;

=>출력

김철수    20    6
이찬수    30    13
박종수    30    16.25
임채호    20    14.91
나대호    30    16.25
박지성    30    14.55
구자철    10    13.35
송기성    20    15
김철호    10    24
성명준    30    17.5
황인태    20    6.3
박민성    30    8.85
박진성    20    18
최철호    10    6.9

 

 


3) nullif : 두 값을 비교하여 같으면 null, 다르면 첫번째 값을 반환하는 함수

-- 형식 : nullif(비교값1, 비교값2)


(문제) emp 테이블에서 이름이 A로 시작하는 직원의 이름과 부서코드를 검색하시오.
 

select ename, deptno, LTRIM(ename, '김'), nullif(ename, LTRIM(ename, '김'))

  from emp where nullif(ename, LTRIM(ename, '김')) is not null;
  
-- =

select * from emp where ename like '김%' ;


=>출력

김철수    20    철수    김철수
김철호    10    철호    김철호

 

 


4) coalesce(코얼레스, 더 큰 덩어리로 합치다) : 여러 개의 list중 null이 아닌 

첫번째 값을 돌려주는 함수

-- 형식 : coalesce(값1, 값2, 값3, ....)

(문제) emp 테이블에서 커미션이 있으면 커미션을 , 만약 커미션이 없으면

해당 급여를 , 커미션과 급여가 다 없는(null) 인 경우는 임의로 20을 치환하여

사원의 이름 및 해당 치환값을 검색하시오.

select ename, comm, sal, coalesce(comm, sal , 20) 치환값 from emp;


>> 출력
 

ename     comm    sal    치환값
김철수        200    200
이찬수    300    260    300
박종수    500    325    500
임채호        497    497
나대호    1400    325    1400
박지성        485    485
구자철        445    445
송기성        500    500
김철호        800    800
성명준    0    350    0
황인태        210    210
박민성        295    295
박진성        600    600
최철호        230    230

 

 

2.비교 처리 함수

 

1) decode :값을 비교하여 해당하는 값을 돌려주는 함수. 단, 비교시에는 정확히

같은 값(=)만 비교가 가능함

-- 형식 : decode(컬럼이나 값, 비교값1, 결과값1, 비교값2, 결과값2,
                ...... 기본치)


** 기본치는 컬럼이나 값이 비교값과 맞지 않을 때 갖는 값이며 생략되면 

null 값을 가짐

 

(문제) emp 테이블에서 각 사원의 이름과 급여, 급여등급을 나타내시오.

단, 급여가 400만원 이상이면 A등급, 300만원 이상이면 B등급, 200만원 이상이면

C등급, 100만원 이상이면 D등급, 100만원 미만이면 E등급으로 나타내시오.

--  trunc 소수점 버리기
-- trunc(실수) => 실수값을 정수로 (버림)

-- decode(A, B,C, D, E) A와 B가 같으면 C 다르면 A와 D가 같으면 E

select ename, sal, decode(trunc(sal/1000), 0, 'E', 1, 'D', 2, 'C', 3, 'B', 'A') 급여등급 from emp;


=>

case 로 변경

select ename , sal,
   
   case 
    when sal >=400 then 'A'
  when sal >=300 then 'B'      
  when sal >=200 then 'C'
  when sal >=100 then 'D'
    else  'E'
  
   end 급여등급
   
from emp;

=>출력

김철수    200    C
이찬수    260    C
박종수    325    B
임채호    497    A
나대호    325    B
박지성    485    A
구자철    445    A
송기성    500    A
김철호    800    A
성명준    350    B
황인태    210    C
박민성    295    C
박진성    600    A
최철호    230    C

 

 

 

2) case : decode 함수를 보완하여 대소, like 등의 비교처리 가능한 함수


-- 형식 : case 컬럼이나 값 when 비교값 1 then 치환값1

        [when 비교값2 then 치환값2 ....
        
        when 비교값n then 치환값 n 

        else 기본치 ]


      end


(문제) professor 테이블에서 각 교수의 이름과 직위, 급여총액(pay+bonus) 을 나타내시오.
단, 이번달 급여는 정교수이면 급여총액의 10%를 , 조교수이면  7%를, 전임강사이면
5%를 더하여 주고 급여가 많은 사람부터 나타내시오.


-- case when 조건 then 값 ...... else 기본값 end 

 

select name, position,

    case 
  
  when position ='정교수' then nvl((pay+bonus)*1.1, 0)
    
    when position='조교수' then nvl((pay+bonus)*1.07, 0)

    when position='전임강사' then nvl((pay+bonus)*1.05, 0)

    else nvl(pay + bonus, 0)

end 

"이번달 급여" 

from professor order by 3 desc;

 

=>여기서 3은 3번째 컬럼을 의미한다.


=> 동등만 비교할 때에는 다음과 같이 변경할 수 있다

select name, position,

    case position
  
  when '정교수' then nvl((pay+bonus)*1.1, 0)
    
    when '조교수' then nvl((pay+bonus)*1.07, 0)

    when '전임강사' then nvl((pay+bonus)*1.05, 0)

    else nvl(pay + bonus, 0)

end 

"이번달 급여" 

from professor order by 3 desc;

 


=> 출력

NAME    POSITION     이번달 급여
허은    조교수        342.4
최슬기    조교수        0
차범철    전임강사    0
주승재    정교수        638
조인형    정교수        715
전민    전임강사    0
양선희    전임강사    0
심슨    정교수        770
송도권    전임강사    0
박원범    조교수        385.2
박승곤    조교수        470.8
바비    정교수        638
나한열    조교수        406.6
김현정    전임강사    0
김영조    조교수        460.1
김도형    정교수        704

 

 


3.순위를 구하는 함수

1)rank : order by 를 포함한 query 문에서 특정 컬럼에 대한 순위를 구하는 함수

 

-- 형식 : rank() over([partition by 컬럼] order by 절)

partition by : 순위를 지정하기 위한 컬럼 그룹을 지정함

 


(문제) emp 테이블에서 전체 사원에 대하여 부서번호, 이름, 급여, 급여순위를 출력하시오.

select deptno, ename, sal, rank() over(order by sal desc) "급여 순위" from emp;

 

=>동률 rank 수를 무시하려면 dense_rank()

=> 출력

 

deptno  ename    sal    급여순위
10    김철호    800    1
20    박진성    600    2
20    송기성    500    3
20    임채호    497    4
30    박지성    485    5
10    구자철    445    6
30    성명준    350    7
30    박종수    325    8
30    나대호    325    8
30    박민성    295    10
30    이찬수    260    11
10    최철호    230    12
20    황인태    210    13
20    김철수    200    14

 

 

(문제) emp 테이블에서 전체 사원에 대하여 부서번호, 이름, 급여, 해당부서 내 급여 순위를 출력하시오.

-- partition by 컬럼( 부서 내에서의 순위)

 

select deptno, ename, sal, rank() over(partition by deptno order by sal desc)

"부서내 급여 순위" from emp;

 

 

=>출력

10    김철호    800    1
10    구자철    445    2
10    최철호    230    3
20    박진성    600    1
20    송기성    500    2
20    임채호    497    3
20    황인태    210    4
20    김철수    200    5
30    박지성    485    1
30    성명준    350    2
30    박종수    325    3
30    나대호    325    3
30    박민성    295    5
30    이찬수    260    6

 

 

 

 

 

 

 

 

 

about author

PHRASE

Level 60  머나먼나라

내가 죽은 뒤에도 나의 정신이 사람들의 마음속에 살아 있으면 나는 죽은 것이 아니다. -캠벌

댓글 ( 4)

댓글 남기기

작성