본문 바로가기
Database & Bigdata/Oracle

[Oracle] 1/27 강의 정리 (오라클 함수, NVL, DECODE, CASE, JOIN)

by jionee 2021. 1. 27.
SMALL

날짜 함수

 

 

SYSDATE 날짜 연산

SELECT SYSDATE
FROM DUAL;

현재 날짜,시간을 가져올 수 있는 함수

 

 

 

형변환 함수

 

 

 

TO_CHAR 포맷

 

SELECT ENAME, SAL, TO_CHAR(SAL,'L999,999')
FROM EMP;

 

 

 

 

NVL 형일치

SELECT EMPNO, ENAME, NVL(MGR,'CEO')
FROM EMP;

MGR이 NULL값인 ( 상사가 없는 ) 경우 CEO라는 문자를 표시하기 위해 NVL을 사용했지만 오류 메시지가 나옴

 

 

SELECT EMPNO, ENAME, NVL(to_char(mgr),'CEO')
FROM EMP;

TO_CHAR을 이용해 MGR칼럼을 CHAR형태로 변환하니 정상적으로 실행됨

 

 

-> NVL을 사용할 땐 칼럼과 표시할 문자의 형이 일치해야함

 

 

 

DECODE

프로그램 언어에서 가장 많이 사용되는 switch case 문과 같은 기능을 가짐

DECODE(표현식, 조건1, 결과1,
			조건2, 결과2,
            조건3, 결과3
            기본결과 n
      )

 

예제)

select empno, ename, job, sal, 
decode(job, 'ANALYST', sal*1.05,
            'SALESMAN', sal*1.1,
            'MANAGER', sal*1.15,
            'CLERK', sal*1.2,
            sal*1.0) 
            as "upsal"
from emp;

 

 

 

CASE 함수

- 여러가지 경우에 대해 하나를 선택하는 함수

- DECODE 함수와 차이점이 있다면 DECODE 함수는 조건 일치(= 비교 연산)하는 경우에만 적용

CASE 함수는 다양한 비교 연산자를 이용해 조건을 제시할 수 있으므로 범위를 지정할 수도 있음

- if else if else 와 유사한 구조

 

CASE 표현식 WHEN 조건1 THEN 결과1
		  WHEN 조건2 THEN 결과2
          WHEN 조건3 THEN 결과3
          ELSE 결과 N
END

 

예제)

SELECT ENAME, SAL,
case when sal between 3000 and 5001 then '최상'
    when sal between 2000 and 3001 then '상'
    when sal between 1000 and 2001 then '중'
    else '하'
    end 등급
from emp
order by 2 desc;

 

 

 

그룹 함수

 

 

 

with 구문

with a as (
select trunc(to_date('20200101','YYYYMMDD')-hiredate) as 근무일수, 
case when 142000 <= trunc(to_date('20200101','YYYYMMDD')-hiredate) then '장기'
    when trunc(to_date('20200101','YYYYMMDD')-hiredate) between 13800 and 14200 then '중기'
    else '단기'
end 구분
from emp
)

select 구분, count(구분) from a
group by 구분;

 

 

 

 

조인

 

 

Non-Equi Join

예시)

select a.ename, a.sal, b.grade
from emp a ,salgrade b
where a.SAL between b.LOSAL and b.HISAL;

 

 

 

SELF JOIN

--4번

select a.ename, a.job
from emp a, emp b
where a.mgr = b.empno and b.ename = 'KING';

 

--5번
select a.ename, b.ename
from emp a, emp b
where a.deptno = b.deptno and a.ename = 'SCOTT' and b.ename <> 'SCOTT';

 

 

OUTER JOIN

select a.ename, a.deptno, b.dname
from emp a, dept b
where a.deptno(+) = b.deptno;

 

 

 

 

ANSI JOIN

 

댓글