본문 바로가기
개발 수업/DB

[Oracle/SQL] SQL 함수(변환함수,null관련함수,기타함수),Table 생성

by 오늘 하루s 2023. 6. 9.
728x90
더보기

Day29. 230609

변환함수

서로 다른 유형의 데이터 타입으로 변환해 결과를 반환하는 함수

변환함수를 통해 형변환을 직접 처리 (명시적 형변환) 해줌,

참고)오라클이 자동으로 형변환 해주는 것 : 묵시적 형변환

 

to_char()

★문자형변환 함수 : 숫자 -> 문자, 날짜 -> 문자

 

숫자 변환 형식

숫자 포맷

1
2
3
select sal, sal*1300*2347890, to_char(sal*1300*230,'000,999,999,999,999')
from emp
order by sal desc;
cs

 

날짜 변환 형식

날짜시간포맷

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
select sysdate,
       to_char(sysdate,'YYYY-MM-DD HH24:MI:SS DAY'),
       to_char(sysdate,'YYY'),
       to_char(sysdate,'YY'),
       to_char(sysdate,'Y')
from dual;
 
select sysdate,
       to_char(sysdate,'YYYY-MM-DD HH24:MI:SS DAY'),
       to_char(sysdate,'MM'),
       to_char(sysdate,'MONTH'),
       to_char(sysdate,'MON')
from dual;
 
select sysdate,
       to_char(sysdate,'YYYY-MM-DD HH24:MI:SS DAY'),
       to_char(sysdate,'DD'), --09 일 -- 01-31로 표현
       to_char(sysdate,'DDD'),--160 일 -- 001-365로 표현
       to_char(sysdate,'D'--6 주중의 일을 1-7로 표현(일요일이 1)
from dual;
cs

 

 

to_number()

숫자변환함수  : 문자 -> 숫자

문자나 다른 유형의 숫자를 NUMBER 형으로 변환하는 함수

1
2
3
select ename, deptno
from emp
where deptno='10'--자동형변환
cs
1
2
3
select ename, deptno
from emp
where deptno=to_number('10');
cs

실행 결과

 

 

to_date()

날짜변환함수 : 문자 -> 날짜

1
2
select to_date('1980/01/01','RRRR/MM/DD')
from dual;
cs

실행 결과



null관련함수

1
2
3
select ename, sal, comm, sal+comm
from emp
order by comm desc;
cs

실행 결과

 

 

NVL(expr1,expr2) , nvl(expr,expr1,expr2)

nvl(expr,expr1) : null인 값을 expr1으로 반환. null아닌 값은 그 값 그대로.

nvl(expr,expr1,expr2) : null인 값을 expr2으로 반환. null아닌 값은 그 값은 expr1으로 반환.

1
2
3
select ename, sal, comm, nvl(comm,0), nvl2(comm,10,100), sal+nvl(comm,0)
from emp
order by comm desc;
cs

실행 결과

 


nullif(expr1,expr2)

expr1과 expr2값이 동일하면 null을 반환. 그렇지않다면 expr1을 반환.

1
2
select sal,nullif(sal,1250)
from emp;
cs

실행 결과

 

 

coalesce(expr1,expr2,...)

표현식이 아닌 1번째 표현식을 반환

1
2
select empno,sal,comm,
coalesce(comm,null,empno, sal) from emp;
cs

실행 결과





기타함수

GREATEST(expr1,expr2,...), LEAST(expr1,expr2,...)

GREATEST : 매개변수로 들어오는 표현식에서 가장 큰 값을 반환

LEAST : 매개변수로 들어오는 표현식에서 가장 작은 값을 반환

1
2
3
select greatest(1,3,9,100,-1),least(1,3,9,100,-1),
greatest('김','이','박','최'),least('김','이','박','최')
from dual;
cs

실행 결과

 

 

DECODE(expr,search1,result1,search2,result2,...,searchN,resultN,defalt)

expr과 search1을 비교해 두 값이 같으면 result1을

같지 않으면 serch2와 비교해 값이 같으면 result2를 반환,..

최종적으로 같은 값이 없으면 default값을 반환

부서번호가 10이면 'accounting'
20이면 'RESEARCH'
30이면 'SALES'
40이면 'OPERATINGS'
그 외 '기타'

 

1
2
3
4
5
6
7
8
select empno,ename,deptno,
DECODE(deptno,10,'accounting',
              20,'RESEARCH',
              30,'SALES',
              40,'OPERATINGS',
                 '기타')
from emp
order by deptno asc;
cs



CASE

CASE 표현식
           WHEN 조건1 THEN 값1
           WHEN 조건2 THEN 값2 ..
           WHEN 조건n THEN 값n
ELSE 기타값 END [AS] 컬럼별칭

 

1
2
3
4
5
6
7
8
9
select empno,ename,deptno,
 CASE WHEN deptno=10 THEN 'accounting'
      WHEN deptno=20 THEN 'RESEARCH'
      --WHEN deptno=30 THEN 'SALES'
      --WHEN deptno=40 THEN 'OPERATINGS'
      ELSE '기타'
 END AS 부서명
from emp
order by deptno asc;
cs

실행 결과

 

1
2
3
4
5
6
7
8
9
select empno,ename,sal,
 CASE WHEN sal<1000 THEN sal+(sal*0.8)
      WHEN sal between 1001 and 2000 THEN sal+(sal*0.6)
      WHEN sal between 2001 and 2050 THEN sal+(sal*0.4)
      WHEN sal between 2051 and 3000 THEN sal+(sal*0.2)
      ELSE sal+(sal*0.1)
 END AS 이달급여
from emp
order by sal desc;
cs

 

 

 

 

Table 생성

CREATE TABLE 테이블명{
               컬럼명 타입(크기),
               컬럼명 타입(크기)
};

 

1
2
3
4
5
6
7
8
9
10
11
12
-- TA1테이블생성
CREATE  TABLE TA1(
 tel varchar2(15)
);
 
-- 값 삽입
insert into TA1 values('02)111-1234');
insert into TA1 values('031)111-1234');
commit;
 
--TA1테이블 조회
select * from TA1;
cs

실행 결과

 

 

728x90