Database (27)

반응형

 

Sequence 객체

 

: 자동적으로 번호를 맺어주는 객체

특별히 설정되는 PK가 없거나 의미 있게 만들지 않아도 되는 경우자동으로 순서적인 번호가 필요한 경우 사용한다.

테이블과 독립적이며 여러 곳에서 사용이 가능하다.

ex) 채팅 등

 

 

- 사용 방법

-- 생성(create), 수정(alter)
(create, alter) sequence 시퀀스명
    increment by 증감값
    minvalue 최소값
    maxvalue 최대값
    cycle; -- 순환 가능 여부

-- 삭제
drop sequence 시퀀스명;


-- 번호 증가 후 그 다음 번호부터 데이터가 삽입된다.

-- 다음 번호 증가
-- 시퀀스명.nextval : 시퀀스 객체의 다음 값(Next Value) 리턴
select 시퀀스명.nextval from 테이블명;

-- 현재 번호 조회
-- 시퀀스명.currval : 시퀀스 객체의 현재 값(Current Value) 리턴
select 시퀀스명.currval from 테이블명;

 

 


 

  • 시퀀스 사용 전
-- 상품 분류테이블에 'P103', 'USB 제품'을 등록하시오?
-- (단, lprod_id 컬럼의 값은 최대값을 구하여 1을 더한 서브쿼리를 작성하여 입력한다.)
select nvl(max(lprod_id), 0) from lprod;

insert into lprod(lprod_id, lprod_gu, lprod_nm)
    values ((select nvl(max(lprod_id), 0)+1 from lprod), 'P103', 'USB제품');

select * from lprod;

 

결과 화면1

 

 

시퀀스명.nextval : 시퀀스 객체의 다음 값(Next Value) 리턴

시퀀스명.currval : 시퀀스 객체의 현재 값(Current Value) 리턴

 

 

  • 시퀀스 사용 후
-- lprod_seq 시퀀스 생성 : 초기값이 15이며 1씩 증가
create sequence lprod_seq
    increment by 1 start with 15;


-- 상품 분류테이블에  'P203' , '아동복' 을 등록하시오?
insert into lprod(lprod_id, lprod_gu, lprod_nm)
    values(lprod_seq.nextval, 'P203', '아동복');
    
select * from lprod;

 

결과 화면2

 

 


 

sequence가 사용되는 경우, 제한되는 경우

 

 

-- sequence 변경
-- 최대 50까지 2씩 증가
alter sequence lprod_seq
    increment by 2
    maxvalue 50
    cycle;
-- cycle을 추가 시 처음으로 돌아감

select lprod_seq.nextval from dual;

select lprod_seq.currval from dual;

 

 

-- sequence 제거 (*rollback 되지 않음)
drop sequence lprod_seq;

 

 

-- 다음 요건을 만족하는 시퀀스를 생성하시오? (P.221 참고)
-- 객체명 : cart_seq, 증감값 : 1, 최소값 : 10000, 최대값 : 99999, 순환가능
create sequence cart_seq
    increment by 1
    minvalue 10000
    maxvalue 99999
    cycle;

select cart_seq.nextval from dual;

 

 

 

Synonym 객체

= 동의어, 별칭

 

: 객체에 대한 다른 이름으로 대체한다.

긴 이름의 객체명을 쉬운 이름으로 대체할 때 사용한다.

 

 

객체를 생성할 때 insufficient privileges 오류가 뜰 시 권한을 줘야함.

아래의 링크를 참조하여 권한을 주면 된다.

 

https://forest-of-coding.tistory.com/6

 

[Database] 1.5장 Oracle user 접속 및 사용권한 부여

Oracle SQL Developer 사용 전 설정할 것 1. Win키 + R 를 누를 시 아래와 같은 실행창을 띄운다. 2. 실행창에 cmd를 입력한다. sqlplus sys/java@localhost:1521 as sysdba 3. 위의 코드를 입력하여 Oracle DB에 접속한다. 4

forest-of-coding.tistory.com

 

권한 부여 후 화면

 

 

- 사용 방법

-- 생성
create synonym 별칭
    for 테이블명;

-- 삭제
drop synonym 별칭;

 

 


 

-- synonym 객체 생성
-- insufficient privileges 오류가 뜰 시 권한을 줘야함.
create synonym mem
    for member;

 

 

-- 두 select 문의 결과는 동일하다.
select * from mem;

select * from member;

 

 

-- 삭제
drop synonym mem;
drop synonym mydual;

 

 

 

ex) 

-- mydual 생성
create synonym mydual for sys.dual;

 

 

select 'Hello World' from mydual;

 

결과 화면3

 

 

select sysdate from mydual;

 

결과 화면4

 

 

-- 삭제
drop synonym mydual;

 

 

 

Index 객체

 

: DB Server의 성능을 가장 많이 좌우하게 되는 요소 중 하나로, 특정 데이터를 빨리 찾기 위해 사용한다.

기본적으로 PK 키와 FK 키를 생성할 때 사용된다.

인덱스를 만드는 데 많은 저장 공간과 시간이 소요되기에 사용 시 주의해야 한다.

index는 수정할 수 없기에 수정을 원할 시 삭제하고 다시 생성해야 한다.

 

 

index 필요, 불필요 컬럼

 

 

 

 

- 사용 방법

-- index는 수정할 수 없기에 수정을 원할 시 삭제하고 다시 생성해야 한다.

-- 생성
create index 별칭
    on 테이블명(컬럼명);

-- 삭제
drop index 별칭;

-- 재생성 : 삭제 후 사용 불가 -> 생성 한 뒤 사용해야함.
alter index 별칭 rebuild;

 

 


 

-- index 객체
-- 회원 생일이 조건절에 자주 사용되어 index를 생성
create index idx_member_bir
    on member(mem_bir);

 

결과 화면5

 

 

select mem_id, mem_name, mem_job, mem_bir
    from member where to_char(mem_bir, 'YYYY') = '1998';

 

결과 화면6

 

 

-- 회원생일에서 년도만 분리하여 인덱스를 생성(Function-based Index)
create index idx_member_bir_year
    on member(to_char(mem_bir, 'YYYY'));

 

drop index idx_member_bir;

drop index idx_member_bir_year;

 

 

-- index 재생성 : 삭제 후 사용 불가 -> 생성 한 뒤 사용해야함.
alter index idx_member_bir rebuild;

 

 

  • 추천 사용 방법
-- index 객체
-- 바로 하단의 방식보단 재구성의 방식으로 하는 것을 권유한다.
-- 아래의 코드 결과 값은 같다.
select cart_no, cart_prod, cart_qty from cart where substr(cart_no, 1, 8) = '20200405';

-- 재구성
select cart_no, cart_prod, cart_qty from cart where cart_no like '20200405%';

-- 또는
select cart_no, cart_prod, cart_qty from cart 
    where cart_no > '2020040500000'
    and cart_no < '2020040599999';

 

 

 

Data Dictionary

 

: DataBase를 위해 Meta 정보를 관리한다.

 

주요 정보

 

사용 방법

 

 

-- all_objects의 모든 컬럼 상세
desc all_objects;

 

결과 화면7

 

 

select table_name, comments from dictionary
    where table_name like 'ALL_%';

 

결과 화면8

 

 

select object_name, object_type, created
    from all_objects
    where owner = 'PC10'
    order by object_type asc;

 

결과 화면9

 

 


 

자주 사용되는 user뷰 : user 뷰 명칭

 

 

-- USER_TABLES의 컬럼 상세를 확인하고 각 테이블 전체 레코드 개수를 출력.
-- (테이블명, 레코드 수)
desc user_tables;

select table_name, rownum
    from user_tables;

 

결과 화면8

 

 

-- USER_CONSTRAINTS, USER_CONS_COLUMNS의 컬럼 상세를 확인하고 상품 테이블의 제약조건을 출력하시오?
-- (컬럼명, 제약명, 타입, 제약내용)
desc user_constraints;
desc user_cons_columns;

select * from all_constraints
    where table_name='PROD';

 

결과 화면9

 

 

반응형
반응형

 

문제

 

1. 각 부서의 최소 급여를 받는 사원의 이름, 급여, 부서번호를 구하시오.

2. 평균 영업사원 급여보다 급여가 적으면서 업무가 영업사원이 아닌 사원들을 표시(사원번호, 이름, 담당 업무, 급여)하시오.

3. 부하직원이 없는 사원의 이름을 표시하시오. (사원 번호가 매니저로 저장되어 있진 않은 사람을 조회해야 함)

4. 부하직원이 있는 사원의 이름을 표시하시오. (사원 번호가 매니저로 저장되어 있는 사람을 조회해야 함)

 

5. 김동혁과 동일한 부서에 속한 사원의 부서코드, 이름, 입사일을 표시하는 질의를 작성하시오.

6. 급여가 평균 급여보다 많은 사원들의 사원 번호와 이름을 표시하되 결과를 급여에 대해서 오름차순으로 정렬하시오.

7. 이름에 “국”이 포함된 사원과 같은 부서에서 일하는 사원의 사원 번호와 이름을 표시하시오.

8. 부서위치가 서울인 사원의 이름과 부서번호 및 담당업무를 표시하시오.

9. 김지완에게 보고하는 사원의 이름과 급여를 표시하시오.

10. 조사부 부서의 사원에 대한 부서번호, 사원이름 및 담당 업무를 표시하시오.

11. 평균 월급보다 많은 급여를 받고 이름에 “우”가 포함된 사원과 같은 부서에서 근무하는 사원의 사원 번호, 이름, 급여를 표시하시오.

12. 평균급여가 가장 적은 업무를 찾으시오.

13. 담당업무가 관리자 인 사원이 소속된 부서와 동일한 부서의 사원을 표시하시오.

 

 

 

1번 문제

 

-- 1. 각 부서의 최소 급여를 받는 사원의 이름, 급여, 부서번호를 구하시오.
select * from emp;
select * from dept;
select e.ename 이름, e.sal 급여, e.deptno 부서번호
    from emp e, 
        (select deptno, min(sal) as sal from emp
            group by deptno) e1
    where e.sal = e1.sal
    order by e.deptno;

 

결과 화면1

 

 

 

2번 문제

 

-- 2. 평균 영업사원 급여보다 급여가 적으면서 업무가 영업사원이 아닌 사원들을 표시(사원번호, 이름, 담당 업무, 급여)하시오.
select * from emp;
select * from dept;

select empno 사원번호, ename 이름, job 담당업무, sal 급여 from emp
    where sal < (select round(avg(sal)) from emp
        where job = '영업사원')
    and job != '영업사원';

select e.empno 사원번호, e.ename 사원명, e.job 담당업무, e.sal 급여
    from emp e,(select avg(sal) sall from emp where job = '영업사원') e1
    where e.sal < e1.sall and  e.job != '영업사원';

 

결과 화면2

 

 

 

3번 문제

 

-- 3. 부하직원이 없는 사원의 이름을 표시하시오. (사원 번호가 매니저로 저장되어 있진 않은 사람을 조회해야 함)
-- deistinct() : 중복 제거
select distinct(ename) 사원명
    from emp
    where ename not in 
        (select e.ename 사원이름 from emp e, emp e1
        where e.empno = e1.mgr);

 

결과 화면3

 

 

 

4번 문제

 

-- 4. 부하직원이 있는 사원의 이름을 표시하시오. (사원 번호가 매니저로 저장되어 있는 사람을 조회해야 함)
select distinct(e.ename) 사원명
    from emp e, emp e1
    where e.empno = e1.mgr;

 

결과 화면4

 

 

 

5번 문제

 

-- 5. 김동혁과 동일한 부서에 속한 사원의 부서코드, 이름, 입사일을 표시하는 질의를 작성하시오.
-- ( 단 김동혁은 제외 )
select * from emp;

select e1.deptno 부서코드, e1.ename 이름, e1.hiredate 입사일
    from emp e, emp e1
    where e.deptno = e1.deptno
    and e.ename = '김동혁'
    and not e1.ename = '김동혁';

 

결과 화면5

 

 

 

6번 문제

 

-- 6. 급여가 평균 급여보다 많은 사원들의 사원 번호와 이름을 표시하되 결과를 급여에 대해서 오름차순으로 정렬하시오.
select empno 사원번호, ename 이름, sal 급여
    from emp
    where sal > (select round(avg(sal), 0) from emp)
    order by sal asc;

 

결과 화면6

 

 

 

7번 문제

 

-- 7. 이름에 “국”이 포함된 사원과 같은 부서에서 일하는 사원의 사원 번호와 이름을 표시하시오.
select * from emp;

select distinct(E1.EMPNO) 사원번호,E1.ENAME 사원명
    from EMP e, EMP E1
    where e.DEPTNO = E1.DEPTNO and
        e.ENAME like '%국%';

 

결과 화면7

 

 

 

8번 문제

 

-- 8. 부서위치가 서울인 사원의 이름과 부서번호 및 담당업무를 표시하시오.
select * from emp;
select * from dept;

select e.ename 사원이름, d.deptno 부서번호, e.job 담당업무 
    from emp e, dept d
    where e.deptno = d.deptno
    and d.loc = '서울';

 

결과 화면8

 

 

 

9번 문제

 

-- 9. 김지완에게 보고하는 사원의 이름과 급여를 표시하시오.
-- 관리자가 김지완
select * from emp;

select e1.ename 사원이름, e1.sal 급여 
    from emp e, emp e1
    where e.empno = e1.mgr 
    and e.ename = '김지완';

 

결과 화면9

 

 

 

10번 문제

 

-- 10. 조사부 부서의 사원에 대한 부서번호, 사원이름 및 담당 업무를 표시하시오.
select * from emp;
select * from dept;
    
select dept.deptno 부서번호, emp.ename 사원명, emp.job 담당업무
    from emp, dept
    where emp.deptno = dept.deptno
    and dept.dname = '조사부';

 

결과 화면10

 

 

 

11번 문제

 

-- 11. 평균 월급보다 많은 급여를 받고 이름에 “우”가 포함된 사원과 같은 부서에서 근무하는 사원의 사원 번호, 이름, 급여를 표시하시오.
select round(avg(sal), 0) from emp;

select e.ename 사원번호, e.ename 이름, e.sal 급여 
    from emp e, (select deptno from emp where ename like '%우%') e1
    where e.sal > (select round(avg(sal), 0) from emp)
    and e1.deptno = e.deptno;

select * from emp;
select * from emp where sal > (select round(avg(sal), 0) from emp);
select * from emp where deptno in (20, 50);
select * from emp where ename like '%우%'; -- 고영우, 박승우
select * from dept; -- 조사부(20), 개발부(50)

 

결과 화면11

 

 

 

12번 문제

 

-- 12. 평균급여가 가장 적은 업무를 찾으시오.
select * from emp;

select job, sal
    from (select job, round(avg(sal)) sal from emp group by job order by sal asc)
    where rownum = 1;

select asd 업무
    from (select job as asd from emp group by job order by avg(sal) asc)
    where rownum=1;

 

결과 화면12

 

 

 

13번 문제

 

-- 13. 담당업무가 관리자 인 사원이 소속된 부서와 동일한 부서의 사원을 표시하시오.
select * from emp;

-- inline view
select distinct(e.ename) 사원명, e.deptno 부서번호, e.job 담당업무 
    from emp e,
    (select deptno from emp where job='관리자')e1
    where e.deptno = e1.deptno;

 

결과 화면13

 

 

반응형
반응형

 

생성해야 하는 테이블과 데이터

 

-- 재고 테이블 생성
create table remain(
    remain_year     char(04)        not null,   -- 해당년도
    remain_prod     varchar2(10)    not null,   -- 상품 코드
    remain_j_00     number(5),                  -- 전년 재고
    remain_i        number(5),                  -- 입고
    remain_o        number(5),                  -- 출고
    remain_j_99     number(5),                  -- 현재 재고
    remain_date     date,                       -- 처리일자
    constraint pk_remain primary key(remain_year, remain_prod), -- 년도별로 재고관리를 함.
    constraint fr_remain_prod foreign key(remain_prod) references prod(prod_id)
    );

 

 

 

다른 Table로부터 데이터 입력

 

타 테이블을 이용하여 데이터를 삽입하는 방법

 

-- 데이터 삽입
-- 2023년도 마감처리
insert into remain(remain_year, remain_prod, remain_j_00, remain_i, remain_o, remain_j_99, remain_date)
    select '2024', prod_id, to_number(substr(prod_id, -2)), 10, 7, to_number(substr(prod_id, -2))+10-7, sysdate from prod;

-- 2019년도 마감처리
insert into remain(remain_year, remain_prod, remain_j_00, remain_i, remain_o, remain_j_99, remain_date)
    select '2020', prod_id, to_number(substr(prod_id, -2)), 20, 8, to_number(substr(prod_id, -2))+20-8, sysdate from prod;

    
-- 데이터 수정
update buyer set buyer_charger = '우수처'
    where exists (select sum(cart.cart_qty * prod.prod_sale) -- 수량 * 판매 금액
        from prod, cart
        where cart.cart_no like '2020%'
        and cart.cart_prod = prod.prod_id
        and prod.prod_buyer = buyer.buyer_id
        having sum(cart.cart_qty * prod.prod_sale) > 80000000);

 

데이터 삽입 결과 확인

 

 

 

 

  • 상품 모두의 2020년도 판매수량을 합산하여 상품테이블의 총판매수량 column 갱신
-- 1. 상품 테이블의 총판매수량 조회
select prod_id 상품코드, sum(nvl(prod_qtysale, 0)) 총판매수량
    from prod
    group by prod_id;

 

결과 화면1

 

 

-- 2. 장바구니 테이블에서 2020년도 상품별 판매수량 합산하여 조회
select prod_id 상품코드, sum(nvl(cart_qty, 0)) 매출수량
    from prod left outer join cart
    on (prod_id = cart_prod and cart_no like '2020%')
    group by prod_id;

 

 

-- 3. 2020년도 상품별 판매수량 합산하여 갱신하시오?
update prod
    set prod_qtysale = (
        select nvl(sum(cart_qty), 0)
        from cart
        where cart_prod = prod_id and cart_no like '2020%');

 

 

-- 4. 수행 결과 확인(인증)
select sum(nvl(prod_qtyin, 0)), sum(nvl(prod_qtysale, 0))
    from prod;

select sum(buy_qty)
    from buyprod
    where buy_date between '2020-01-01' and '2020-12-31';

select sum(cart_qty)
    from cart
    where cart_no like '2020%';

 

결과 화면2

 

 

 

  • 상품 모두의 2020년도 입고수량, 판매수량을 합산하여 재고수(remain)테이블의 입고, 출고, 현 재고 coulmn을 수정
-- 1. 2020년도 입고수량 및 판매수량을 서브쿼리로 조회
select prod_id, 
    (select sum(nvl(buy_qty, 0)) from buyprod
        where prod_id = buy_prod
        and to_char(buy_date, 'yyyy') = '2020') as int_amt,
    (select sum(nvl(cart_qty, 0)) from cart
        where prod_id = cart_prod
        and cart_no like '2020%') as out_amt
    from prod;

 

 

-- 2. 1) 번에의 쿼리를  Inline View 로 적용하여 재고수 테이블 수정
-- ( 다중행, 다중열 서브쿼리는 자주 사용하지는 않지만 Update 할 때 유용하게 사용할 수 있음.)
update remain
    set (remain_i, remain_o, remain_j_99) =
        (select in_amt, out_amt, remain_j_00 + in_amt - out_amt
        from
            (select prod_id,
                (select sum(nvl(buy_qty,0))
                    from buyprod
                    where prod_id = buy_prod
                    and to_char(buy_date, 'yyyy') = '2020') as in_amt,
                (select sum(nvl(cart_qty,0))
                    from cart
                    where prod_id = cart_prod
                    and cart_no like '2020%') as out_amt
            from prod) a
        where remain_prod = a.prod_id)

 

 

-- 3. 수행 결과 확인(검증)
select * from remain where remain_year = '2020';

select sum(nvl(remain_i, 0)), sum(nvl(remain_o, 0))
    from remain
    where remain_year = '2020';
    
select sum(buy_qty) from buyprod where buy_date between '2020-01-01' and '2020-12-31';

select sum(cart_qty) from cart where cart_no like '2020%';

 

결과 화면3

 

결과 화면4

 

 

 

  • 재고 수 테이블에서 2020년도 자료 중 입고수량 + 출고수량이 20개 이상인 자료를 삭제하시오.
-- 1. 조회
select remain_year 연도, remain_prod 상품, remain_i 입고량, remain_o 출고량, remain_i + remain_o 합계수량
    from remain
    where remain_year = '2020'
    and (nvl(remain_i, 0) + nvl(remain_o, 0)) >= 200;

 

결과 화면5

 

 

-- 2. 삭제
delete from remain where remain_year = '2020'
    and (nvl(remain_i, 0) + nvl(remain_o, 0)) >= 200;

 

결과 화면6

 

 

 

  • 2020년도 구매금액이 3천만원 이상인 회원의 마일리지 점수를 20만으로 하여 수정하시오.
-- 2020년도 구매금액이 3천만원 이상인 회원의 마일리지 점수를 20만으로 하여 수정하시오.
select mem_id 회원ID, mem_name 성명, mem_mileage 마일리지 
    from member
    where exists(select sum(cart.cart_qty * prod.prod_sale) 
        from prod, cart
        where cart.cart_no like '2020%'
        and cart.cart_prod = prod.prod_id
        and cart.cart_member = member.mem_id
        having sum(cart.cart_qty * prod.prod_sale) > 30000000);

 

결과 화면7

 

 

-- 1. 상품 테이블의 총 입고수량 조회
select prod_id 상품코드, sum(nvl(prod_qtyin, 0)) 총입고수량
    from prod
    group by prod_id;

 

결과 화면8 : 원래는 총판매수량이 0으로 나옴 (업데이트 한 뒤 결과물이라 위와 같이 나온 것임)

 

 

-- 2. 모든 상품의 2020년도 상품별 입고수량 합산하여 조회
select prod.prod_id 상품코드, sum(nvl(buyprod.buy_qty,0)) 매입수량
    from prod left outer join buyprod 
        on (prod.prod_id = buyprod.buy_prod and buyprod.buy_date between '2020-01-01' and '2020-12-31')
    group by prod.prod_id;
    
select prod.prod_id 상품코드, sum(nvl(buyprod.buy_qty,0)) 매입수량
    from prod, buyprod 
    where prod.prod_id = buyprod.buy_prod 
    and buyprod.buy_date between '2020-01-01' and '2020-12-31'
    group by prod.prod_id
    order by prod_id;

 

결과 화면9

 

 

-- 3. 2020년도 상품별 입고수량 합산하여 갱신
update prod
    set prod.prod_qtyin = 
        (select sum (buyprod.buy_qty)
            from buyprod
            where prod.prod_id = buyprod.buy_prod
            and buyprod.buy_date between '2020-01-01' and '2020-12-31'
        );

 

 

-- 4. 수행 확인
select prod_id 상품코드, sum(nvl(prod_qtyin, 0)) 총입고수량
    from prod
    group by prod_id;

 

결과 화면10

 

 

 

  • 상품 모두의 2020년도 판매수량을 합산하여 상품테이블의 총판매수량 column 갱신하시오.
-- 상품 모두의 2020년도 판매수량을 합산하여 상품테이블의 총판매수량 column 갱신
-- 1. 상품 테이블의 총판매수량 조회
select prod_id 상품코드, sum(nvl(prod_qtysale, 0)) 총판매수량
    from prod
    group by prod_id;

 

결과 화면11 : 원래는 총판매수량이 0으로 나옴 (업데이트 한 뒤 결과물이라 위와 같이 나온 것임)

 

 

-- 2. 장바구니 테이블에서 2020년도 상품별 판매수량 합산하여 조회
select prod_id 상품코드, sum(nvl(cart_qty, 0)) 매출수량
    from prod left outer join cart
    on (prod_id = cart_prod and cart_no like '2020%')
    group by prod_id;

 

결과 화면12

 

 

-- 3. 2020년도 상품별 판매수량 합산하여 갱신하시오?
update prod
    set prod_qtysale = (
        select nvl(sum(cart_qty), 0)
        from cart
        where cart_prod = prod_id and cart_no like '2020%');

 

 

-- 4. 수행 결과 확인(인증)
select sum(nvl(prod_qtyin, 0)), sum(nvl(prod_qtysale, 0))
    from prod;

select sum(buy_qty)
    from buyprod
    where buy_date between '2020-01-01' and '2020-12-31';

select sum(cart_qty)
    from cart
    where cart_no like '2020%';

 

결과 화면13

 

 

 

  • 상품 모두의 2020년도 입고수량, 판매수량을 합산하여 재고수(remain)테이블의 입고, 출고, 현 재고 coulmn을 수정하시오.
-- 상품 모두의 2020년도 입고수량, 판매수량을 합산하여 재고수(remain)테이블의 입고, 출고, 현 재고 coulmn을 수정
-- 1. 2020년도 입고수량 및 판매수량을 서브쿼리로 조회
select prod_id, 
    (select sum(nvl(buy_qty, 0)) from buyprod
        where prod_id = buy_prod
        and to_char(buy_date, 'yyyy') = '2020') as int_amt,
    (select sum(nvl(cart_qty, 0)) from cart
        where prod_id = cart_prod
        and cart_no like '2020%') as out_amt
    from prod;

 

결과 화면14

 

 

-- 2. 1) 번에의 쿼리를  Inline View 로 적용하여 재고수 테이블 수정
-- ( 다중행, 다중열 서브쿼리는 자주 사용하지는 않지만 Update 할 때 유용하게 사용할 수 있음.)
update remain
    set (remain_i, remain_o, remain_j_99) =
        (select in_amt, out_amt, remain_j_00 + in_amt - out_amt
        from
            (select prod_id,
                (select sum(nvl(buy_qty,0))
                    from buyprod
                    where prod_id = buy_prod
                    and to_char(buy_date, 'yyyy') = '2020') as in_amt,
                (select sum(nvl(cart_qty,0))
                    from cart
                    where prod_id = cart_prod
                    and cart_no like '2020%') as out_amt
            from prod) a
        where remain_prod = a.prod_id)
    where remain_year = '2020';

 

 

-- 3. 수행 결과 확인(검증)
select * from remain where remain_year = '2020';

 

결과 화면15

 

 

-- 3. 수행 결과 확인(검증)
select sum(nvl(remain_i, 0)), sum(nvl(remain_o, 0))
    from remain
    where remain_year = '2020';

 

결과 화면16

 

 

+ 2024년도 마감처리, 2019년도 마감처리 작업

-- 2023년도 마감처리
insert into remain(remain_year, remain_prod, remain_j_00, remain_i, remain_o, remain_j_99, remain_date)
    select '2024', prod_id, to_number(substr(prod_id, -2)), 10, 7, to_number(substr(prod_id, -2))+10-7, sysdate from prod;

-- 2019년도 마감처리
insert into remain(remain_year, remain_prod, remain_j_00, remain_i, remain_o, remain_j_99, remain_date)
    select '2020', prod_id, to_number(substr(prod_id, -2)), 20, 8, to_number(substr(prod_id, -2))+20-8, sysdate from prod;

select * from remain;

 

 

 

테이블 생성 (복사)

 

-- table 생성 구문
create table 테이블 이름
    as 서브쿼리;

 

-- 재고수 테이블을 복사하여 remain2 테이블을 생성하시오.
create table remain2
    as select * from remain;

 

결과 화면17

 

 

-- delete와 truncate의 차이
-- delete : 삭제 후 롤백 가능
-- truncate : 삭제 후 롤백 불가능 (커밋까지 완료함)

-- 조회 & 롤백
select * from remain2;
rollback;


-- 테이블의 내용을 모두 삭제
-- 롤백 시 테이블 내용 삭제 전으로 돌아감
delete from remain2;

-- 삭제 후 커밋 -> 롤백 시 돌아가지 않음
truncate table remain2;

-- 추후 테스트용 테이블 삭제
drop table remain2;

 

 

  • 재고 수 테이블에서 2020년도 자료 중 입고수량 + 출고수량이 200개 이상인 자료를 삭제하시오.
-- 1. 조회
select remain_year 연도, remain_prod 상품, remain_i 입고량, remain_o 출고량, remain_i + remain_o 합계수량
    from remain
    where remain_year = '2020'
    and (nvl(remain_i, 0) + nvl(remain_o, 0)) >= 200;

 

 

-- 2. 삭제
delete from remain where remain_year = '2020'
    and (nvl(remain_i, 0) + nvl(remain_o, 0)) >= 200;

 

 

반응형
1 2 3 4 5 ··· 9