23/01/05 [Database]

웰치스·2023년 1월 5일
0

23/01/05

📌 8. 데이터조작어(DML)

  • 데이터조작어(DML)
    : 테이블에 새로운 행 추가 (Insert)
      테이블의 기존 행 수정 (Update)
      테이블의 기존 행 삭제 (Delete)

  • insert, update, delete => 작업단위 : row(행)


📂 INSERT 구문

insert into departments
values (280, 'Java',200,1700);

  • 컬럼 리스트와 값 리스트의 개수와 순서가 맞아야함!
insert into departments(department_name, location_id,
						manager_id, department_id)
values('Jsp',1700,201,290);

  • 자동으로 null값을 삽입하는 방법
insert into departments(department_id, department_name)
values (300, 'MySQL');

  • 수동으로 null값을 삽입하는 방법
insert into departments
values (310, 'Html', 202, null);

Subquery가 사용된 insert 구문

  • employees테이블과 같은 copy_emp 테이블 만들기
    (구조는 같지만 내용은 비어있음)
create table copy_emp
as select*
    from employees
    where 1=2;
    
desc copy_emp;  
  • copy_emp 테이블에 employees테이블의 컬럼들을 복사
insert into copy_emp
    select*
    from employees; 

📂 UPDATE 구문

  • 변경 전 -> 113번 사원의 정보
select employee_id, salary, department_id
from employees
where employee_id=113;

  • 변경 후 -> 113번 사원의 정보
update employees
set department_id = 50, salary =7200
where employee_id = 113;

select employee_id, salary, department_id
from employees
where employee_id=113;

  • update 구문 작성 시 where절을 생략하고 작성해서 되돌릴때
update copy_emp
set department_id=110;

select employee_id,department_id
from copy_emp;

rollback;

select employee_id,department_id
from copy_emp;

Subquery가 사용된 update 구문

select employee_id, last_name, job_id, salary
from copy_emp
where employee_id in (113,205);

  • 113직원의 salary와 job_id를 205직원과 동일하게 만들고 싶을때 (하지만 205직원의 정보를 모를때 subquery 사용)
update copy_emp
set job_id = (select job_id
                     from copy_emp
                     where employee_id = 205),
      salary = (select salary
                    from copy_emp
                    where employee_id = 205)
where employee_id = 113;   


select employee_id, last_name, job_id, salary
from copy_emp
where employee_id in (113,205);


📂 DELETE 구문

delete from departments
where department_id = 300;

select*
from departments
order by department_id desc;

Subquery가 사용된 delete 구문

  • location_id = 1800인 부서에 소속된 사원들 삭제!
delete from copy_emp
where department_id = (select department_id
                       from departments
                       where location_id = 1800);

select employee_id, last_name, department_id
from copy_emp
where department_id = (select department_id
                       from departments
                       where location_id = 1800);


📌 9. 트랜잭션 처리하기

  • 트랜잭션(Transaction)
    : 논리적인 작업 단위
      여러 DML이 모여서 하나의 트랜잭션이 구성됨.(insert, update, delete)
      하나의 DDL 구문이 하나의 트랜잭션을 구성함. (create, alter, drop, truncate)
      하나의 DCL 구문이 하나의 트랜잭션을 구성함. (grant,revoke)
      DML 작업 후 commit, rollback으로 트랜잭션 종료해야함.

  • 트랜잭션 제어 명령어(TCL)
    COMMIT : 트랜잭션을 영구히 저장함.
    ROLLBACK : 트랜잭션 처음으로 되돌림.
    SAVEPOINT : 트랜잭션 진행 중 되돌아갈 지점(기점, 포인트)을 생성함.

📂 트랜잭션 시작 및 종료

  • 시작 : 첫 번째 DML 구문 실행 시
  • 종료 : COMMIT 또는 ROLLBACK 실행 시
// 트랜잭션 시작
update ---;
insert ---;
update ---;
commit;
// 트랜잭션 종료

// 트랜잭션 시작
insert ---;
delete ---;
rollback;
// 트랜잭션 종료
  • 종료 : DDL 또는 DCL 구문 실행 시 (autocommit)
// 트랜잭션 시작
create table ---; (DDL)
(autocommit 내포)
// 트랜잭션 종료

// 트랜잭션 시작
grant ---; (DCL)
(autocommit 내포)
// 트랜잭션 종료

// 트랜잭션 시작
update ---;
update ---;
insert ---;

create table ---; 
(DDL - autocommit 실행)
// 트랜잭션 종료
  • SQL *PLUS 종료 시 (autocommit)
// 트랜잭션 시작
delete ---;
update ---;
SQL Plue 또는 SQL Developer를 정상 종료함.
(autocommit)
// 트랜잭션 종료

// 트랜잭션 시작
delete ---;
update ---;
SQL Plue 또는 SQL Developer를 비정상 종료함.
(autorollback)
// 트랜잭션 종료

📂 Savepoint 사용하기



0개의 댓글