[Oracle] day_39 함수의 사용 예제로 복습하기

2020. 12. 17. 20:26Web_Back-end/Oracle

 

2020/12/17 - [개발/Oracle] - [Oracle] 2020.12.17. day_39 조건함수(decode & case문), 변환함수(문자변환 to_char(), 날짜변환 to_date(), 숫자변환 to_number())

2020/12/17 - [개발/Oracle] - [Oracle] 2020.12.17. day_39 Oracle에서 제공하는 함수(수치함수, null변환함수, 문자열함수), dual table

2020/12/16 - [개발/Oracle] - [Oracle] 2020.12.16. day_38 select _ 조회되는 레코드의 중복 값 제거 1. distinct 2. group by

2020/12/16 - [개발/Oracle] - [Oracle] 2020.12.16. day_38 sqlldr.exe 엑셀파일 변환하여 커밋하기, golden7에서 파일 불러오기(CSV파일이 아닌 파일도 가능)

2020/12/16 - [개발/Oracle] - [Oracle] 2020.12.16. day_38 select 문자열 연산자

2020/12/16 - [개발/Oracle] - [Oracle] 2020.12.16. day_38 select , select 연산자 사용, alias, alias""로 대소문자구분

위의 모든 내용을 복습하기


 

문제 실행결과
--1. 사원 테이블에서 모든 사원의 사원번호 ,사원명, 입사일,연봉, 월급을 조회하세요.
--단, 월급은 연봉을 12로 나눈 값으로 소수점 첫번째자리에서 반올림하여 출력합니다.
1
2
select empno, ename, hiredate, sal, round(sal/120) sal_month
from   emp;
cs
  • 반올림하는 round()함수를 사용한다
  • round(값, 반올림할 자릿수) 
  • 단, 실수부와 정수부에서 적용되는 일이 다르다
  • 실수부(.를 기준으로 오른쪽 양수인덱스) : 반올림하여 볼 자릿수
  • 정수부(.를 기준으로 왼쪽 음수인덱스) : 반올림할 자릿수

 

문제 실행결과
--2. 사원 테이블에서 입사월이 12월인 사원들의 사원번호, 사원명, 입사일,
--연봉, 실수령액을 조회하세요.
--단, 실수령액은 연봉과 보너스를 합산한 금액으로 연산하고,
--세금은 실수령액에서 3.3%를 제외한  금액으로 연산하여 원단위절사하여 출력합니다.
1
2
3
4
select  empno, ename, hiredate, sal,
trunc((sal+nvl(comm,0))-((sal+nvl(comm,0))*0.033),-1) sal_real
from        emp
where     to_char(hiredate, 'mm')=12;
cs
  • 연산을 해야하는 식에서 null값이 들어가 있다면, 연산결과를 볼 수 없기 때문에
  • nvl() 함수를 가용하여 null인지를 먼저 확인한다
  • nul(값, 'null일때 반환할 값') 
  • comm값이 null인 경우 0을 반환하여, sal과 comm을 연산한다
  • 원 단위로 절사하기 위해 trunc()함수를 사용한다
  • trunc(값, 절사할 자릿수)

 

문제 실행결과
--3. 사원 테이블에서 10번 부서와 30번 부서에 근무하면서 매니저가 있는 사원의
--    사원번호, 매니저번호, 입사일, 연봉, 사원명, 직무를 조회하세요.
--    단, 입사일은 "년-월-일 분기 요일" 의 형식으로 출력하되 년도는 2자리만 출력
--      하세요, 사원명은 모두 소문자로 출력하고, 직무는 앞자리만 대문자로 출력하세요.
1
2
3
4
5
6
7
select  empno, mgr,
        to_char(hiredate, 'yy-mm-dd q"분기" day')
        sal,
        lower(ename) ename,
        initcap(job) job
from     emp
where   (deptno=10 or deptno=30) and mgr is not null;
cs
  • to_char() 함수를 통해 날짜를 변환한다
  • to_char(날짜, 'pattern') 
  • 소문자로 반환하는 lower(), 앞글자만 대문자로 반환하는 initcap() 을 사용한다
문제 실행결과
--4. 아래의 값을 입력할 수 있는 테이블을생성하고 데이터를 추가하세요.
/* 12345,'김ㅇ규','880101-1234567'
   4326,'남ㅇ진','980101-2234567'
   51,'민ㅇ권','991217-1234567'
   98762,'배ㅇ리','991212-1234567'
   961,'정ㅇ진','001212-4234567'
*/

select * from work_1217;
하여 출력해서 확인한다 --여기@@@@

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
create table work_1217(
    wnum number(5),
    wname char(9),
    wid char(14)
);
 
insert into work_1217 (wnum, wname, wid) values (12345,'김0규','880101-1234567');
commit;
insert into work_1217 (wnum, wname, wid) values (4326,'남ㅇ진','980101-2234567');
commit;
insert into work_1217 (wnum, wname, wid) values (51,'민ㅇ권','991217-1234567');
commit;
insert into work_1217 (wnum, wname, wid) values (98762,'배ㅇ리','991212-1234567');
commit;
insert into work_1217 (wnum, wname, wid) values (961,'정ㅇ진','001212-4234567');
commit;
cs
  • 한글의 바이트수는 2 or 3바이트이므로 주의하여 테이블을 작성한다
  • create table 로 테이블을 만들고,
  • insert into 테이블명 (컬럼,,) values (값,,) 으로 값을 넣는다
  • transaction 의 대상쿼리는 insert, update, delete :
    • 정상적으로 종료되는 경우에는 commit을 하여 작업상태를 저장해야한다

 

문제 실행결과
--5. 4번에서 생성한 테이블을 사용하여 번호, 이름, 주민번호 -앞자리만,  성별 을 조회하세요.
-- 단, 번호는 I_00000000 의 형식으로 출력할 것.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
select
    lpad(wnum, 10'I_00000000') wnum,
    wname, wid,
 
    substr(wid, 1, instr(wid, '-')-1) id_info,
 
    case
        mod(substr(wid, instr(wid, '-')+11), 2)
    when 0 then '여성'
    else '남성'
 
    end
    gender
from        work_1217;
cs
  • lpad() 함수를 통해 글자를 원하는 스타일로 패딩한다
  • lpad는 문자열 앞에 문자열을 채워 지정한 길이의 문자열을 만든다
  • lpad(값, 전체글자수, 채울문자) //채울 문자에 숫자도 가능하다
  • substr() 함수를 통해 특정 문자열을 자를 수 있는데 해당문자의 인덱스를 알기위해,
  • instr() 함수를 통해 얻어낸다
  • instr(값, '기준문자열')
  • case문으로 0일경우 여성을, 이외의 경우 남성을 반환할 수 있게 작성한다
  • case 컬럼명 when 비교값 then 실행코드 else 비교값이 없을 때 실행코드 end

 

문제 실행결과
--6. 4번에서 생성한 테이블에서 이름이 '배ㅇ리'인 사람의 주민번호를 '991212-2234567' 로 변경하세요.
1
2
3
4
5
6
7
update  work_1217
set     wid = '991212-2234567'
where    wname='배ㅇ리';

commit;
 
select     *
from     work_1217
where    wname = '배ㅇ리';
cs
  • update와 set을 통해 해당컬럼의 값(도메인)을 변경할 수 있다
  • update는 transaction대상 쿼리이기 때문에 완료후에 commit 해준다
  • transaction 의 대상쿼리는 insert, update, delete :
    • 정상적으로 종료되는 경우에는 commit을 하여 작업상태를 저장해야한다