[Oracle] 고급함수
programming/database

[Oracle] 고급함수

9. 고급함수

 

9.1 null값 처리함수

9.1.1 NVL

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

 

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

 

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

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

SELECT ename, job, sal*nvl(comm, 3)/100 커미션
FROM Emp;

 

(문제) emp 테이블에서 사원의 이름, 직책, 연봉을 나타내시오.

SELECT ename, job, sal, comm, (sal*12 + comm) 연봉
FROM Emp;

 

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

select ename, deptno, sal, comm, (sal*12 + nvl(comm, 0)) 연봉

 

9.1.2 nvl2

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

 

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

 

(문제) emp 테이블에서 커미션이 원래 있는 직원은 5%를 적용하고 없던 직원은 3%를 적용하여 특별보너스를 계산하시오.

 

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

from emp;

 

9.1.3 nullif

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

 

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

 

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

 

select ename, deptno from emp

where nullif(ename, LTRIM(ename, '김')) is not null;

 

9.1.4 coalesce(코얼레스, 더 큰 덩어리로 합치다)

여러 개의 list 중 null이 아닌 첫번째 값을 돌려주는 함수

 

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

 

(문제) emp 테이블에서 커미션이 있으면 커미션을, 만약 커미션이 없으면 해당 급여를, 커미션과 급여가 다 없는(null)인 경우는 임의로 20을 치환하여 사원의 이름 및 해당 치환값을 검색하시오.

 

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

from emp;

 

 

9.2 비교 처리 함수

9.2.1 decode

값을 비교하여 해당하는 값을 돌려주는 함수. 단, 비교시에는 정확히 같은 값(=)만 비교가 가능함

-- 형식 : decode(컬럼이나 값, 비교값1, 결과값1,

비교값2, 결과값2,

.......        기본치)

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

 

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

단, 급여가 400만원 이상이면 A등급, 300만원 이상이면 B등급, 200만원 이상이면 C등급, 100만원 이상이면 D등급, 100만원 미만이면 E등급으로 나타내시오.

 

select ename, sal, decode(trunc(sal/100), 0, 'E'

1, 'D',

2, 'C',

3, 'B',

'A') 급여등급 from emp;

 

(문제) score 테이블에서 이름, 국어점수, 영어점수, 수학점수, 총점, 평균, 등급을 나타내시오. 등급은 평균점수가 90~100점이면 A등급, 80점대이면 B등급, 70점대이면 C등급, 60점대이면 D등급, 60점 미만이면 F등급으로 나타내시오.

 

 

 

 

 

9.2.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%를 더하여 주고 급여가 많은 사람부터 나타내시오.

 

 

 

(문제) score 테이블에서 이름, 국어점수, 영어점수, 수학점수, 총점, 평균, 등급을 나타내시오. 등급은 평균점수가 90~100점이면 A등급, 80점대이면 B등급, 70점대이면 C등급, 60점대이면 D등급, 60점 미만이면 F등급으로 나타내시오.

 

 

 

9.3 순위를 구하는 함수

9.3.1 rank

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

 

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

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

중복 rank를 무시함

 

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

 

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

 

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