수업/정리

220127 DML, TCL, 무결성 제약조건

jumphare 2022. 1. 27. 18:33

9. DML(Data ManipulationLanguege: 데이터 조작어)

 

 * update set : 데이터 수정
   - 형식
           update 테이블명 set 컬럼1=수정할값1,
            컬럼2=수정할값2,...
           where 조건절;

   - 모든 데이터 수정 -> where 조건절 사용하지 않는 경우
        update emp01 set sal=sal*1.1; --전체 변경

   - 특정 데이터 수정 -> where 조건절 사용
        update emp02 set hiredate=sysdate where substr(hiredate,1,2)='87'; --87년 입사자 날짜 변경
        update emp02 set hiredate=sysdate, sal=50, comm=4000 where ename='SCOTT'; --scott 정보 변경


   - 서브쿼리 이용한 데이터 수정
        update dept01 set loc=(select loc from dept01 where deptno=40) where deptno=20;

        -- 부서번호 40인 row의 loc값으로, 부서번호 20인 row의 loc값을 수정

 * delete from: 데이터 삭제
   - 형식
           delete from 테이블명 where 조건절;
   - 모든 데이터 삭제 -> where 조건절 사용하지 않음
        delete from dept01;

   - 특정 데이터 삭제 -> where 조건절 사용
        delete from dept01 where deptno=30;

   - 서브쿼리 이용한 데이터 삭제
        delete from emp02 where deptno=(select deptno from dept01 where dname='SALES');

 * merge: 테이블 합병
    : 동일한 구조의 두 테이블만 합병 가능
    : 기존에 존재하는 값이 있는 row는 새로운 값으로 update존재하는 값이 없는 row는 insert

   merge into emp01
          using emp02  
          on(emp01.empno = emp02.empno)                                  // 공통조건
          when matched then                                                      // 기존에 존재하는 값이 있다면
              update set emp01.ename = emp02.ename,                    // emp02의 값을 01에 덮어써라(update)
                             emp01.job = emp02.job,
                             emp01.mgr = emp02.mgr,
                             emp01.hiredate = emp02.hiredate,
                             emp01.sal = emp02.sal,
                             emp01.comm = emp02.comm,
                             emp01.deptno = emp02.deptno
          when not matched then                                                 // 기존에 존재하는 값이 없다면
              insert values(emp02.empno, emp02.ename, emp02.job,     // emp2 값을 01에 insert         
                               emp02.mgr,emp02.hiredate, emp02.sal, emp02.comm,emp02.deptno);

merge 전
merge 후


10. TCL (Transaction Control Language)
  트랜잭션
    : 오라클에서 발생하는 여러 sql 명령문을 하나의 논리적인 작업 단위로 처리하는 것
    : 데이터의 일관성을 유지하면서, 데이터를 안정적으로 복구하기 위해 사용
    : 하나의 트랜잭션은 All-OR-Nohing방식
        -> 명령어의 집합 전체가 정상적으로 처리될 시 정상 종료(all), 하나라도 잘못될 경우 전체 취소(nothing)
        -> 데이터의 무결성 보장

 * commit        ---> ALL
    : 모든 작업들을 정상적으로 처리한다고 확정하는 명령어 (실제 DB에 저장)
   - 처리과정을 DB에 모두 반영하기 위해 변경 내용을 영구 저장 (작업 데이터 완전 update)
   - commit 명령어를 수행하면 하나의 트랜잭션 과정이 종료됨
        delete from dept01 where deptno=20;
        commit;
        ---> 트랜젝션 완료(all) 후 종료되었으므로 rollback(nothing)으로 되돌릴수 없음
   - 자동 commit
     01. sql이 정상적으로 종료: quit, exit, con.close()
     02. DDL, DCL 명령문 수행: DDL(create, alter, drop,...) DCL(grant, revoke)

   ※ DDL(truncate)와 DML(delete)의 차이 ---> 롤백 가능 여부
     ---> truncate는 DDL 명령어이므로 이를 이용할 경우 자동 commit-> 영구삭제, 복구(롤백) 불가
     ---> delete는 DML 명령어 -> 직접 commit해서 트랜잭션 완료되기 전까지 롤백 가능

 * rollback        ---> Nothing
    : 트랜잭션의 처리과정에서 발생한 변경사항을 취소하는 명령어
   - 처리 중이던 모든 과정을 취소하고 하나의 묶음 처리가 시작되기 이전의 상태로 되돌림 (이전 commit한 곳)
   - rollback 명령어를 수행하면 하나의 트랜잭션 과정이 종료됨 (commit이랑 차이 기억)
        delete from dept01;
        rollback;
   - 자동 rollback
     01. sql이 비정상적으로 종료되면 자동 rollback
     02. 정전이나 컴퓨터 전원이 끊기는 등의 문제 발생 시 자동 rollback

 * savepoint
    : 트랜잭션 처리과정 내에 복구할 시점(저장점)을 지정하는 명령어 -> 트랜잭션을 분할
   - 여러 개의 sql문을 실행하는 트랜잭션의 경우 유저가 중간에 세이브포인트 지정 가능
   - rollback to savepoint 문을 이용해 지정한 세이브포인트까지 롤백할 수 있음
   - A-B-C-현재시점이라고 할 때 A까지 롤백하려면 세이브포인트 C 롤백, B 롤백, 전체롤백 순으로 실행해야함


11. 무결성 제약 조건(Integrity Constraint Rule)
    : 테이블에 부적절한 자료가 입력되는 것을 방지하기 위해 테이블 생성할 때 컬럼에 대해 정의하는 여러가지 규칙
 * 제약조건명
    제약 조건에 대한 label을 붙이는 것

 * NOT NULL
    : null 값을 허용하지 않는다    ---> 반드시 값을 입력해야 한다

 * UNIQUE
    : 유일한 값만 입력할 수 있다   ---> 중복을 허용하지 않는다
    : null 값 허용


 * PRIMARY KEY (기본키)
    : null 값을 허용하지 않음 (not null의 특징)
    : 중복을 허용하지 않음 (unique의 특징)       ---> not null+unique


 * FOREIGN KEY

 * CHECK

 * DEFAULT