DML(Data Manuplation Language) : 데이터 조작어 ==> insert, update, delete, merge
: 수동 commit 이므로 rollback 이 가능하다.
DDL(Data Definition Language) : 데이터 정의어 ==> create, drop, alter, truncate
: 자동 commit( Auto commit) 이므로 rollback 이 불가하다.
DCL(Data Control Language) : 데이터 제어어 ==> grant, revoke
: 자동 commit( Auto commit) 이므로 rollback 이 불가하다.
TCL(Transaction Control Language) : 트랜잭션 제어어 ==> commit, rollback
DQL(Data Query Language) : 데이터 질의어 ==> select
DML 문은 기본적으로 수동 commit 이다.
즉, DML 문을 수행한 다음에는 바로 디스크(파일)에 적용되지 않고 commit 해야만 적용된다.
그래서 DML 문을 수행한 다음에 디스크(파일)에 적용치 않고자 한다라면 rollback 하면 된다.
insert 는 문법이
insert into 테이블명(컬럼명1,컬럼명2,...) values(값1,값2,...); 이다
※ Unconditional insert all -- ==> 조건이 없는 insert
[문법] insert all
into 테이블명1(컬럼명1, 컬럼명2, ....)
values(값1, 값2, .....)
into 테이블명2(컬럼명3, 컬럼명4, ....)
values(값3, 값4, .....)
SUB Query문;
ex)
insert all
into TBL_EMP1(empno, ename, monthsal, gender, manager_id, department_id, department_name)
values(employee_id, fullname,month_sal, gender,manager_id,department_id,department_name )
into TBL_EMP1_BACKUP(empno, ename, monthsal, gender, manager_id, department_id, department_name)
values(employee_id, fullname,month_sal, gender,manager_id,department_id,department_name)
select employee_id
, first_name || ' ' || last_name AS fullname
, nvl(salary + (salary * commission_pct), salary) AS month_sal
, case when substr(jubun,7,1) in('1','3') then '남' else '여' end AS gender
, E.manager_id
, E.department_id
, department_name
from employees E LEFT JOIN departments D
on E.department_id = D.department_id
order by E.department_id asc, employee_id asc;
※ Conditional insert all -- ==> 조건이 있는 insert
조건(where절)에 일치하는 행들만 특정 테이블로 찾아가서 insert 하도록 하는 것이다.
ex)
insert all
when department_id = 30 then -- 컬럼의 값이 30인가..?
into tbl_emp_dept30(empno, ename, monthsal, gender, manager_id, department_id, department_name)
values(employee_id, fullname,month_sal, gender,manager_id,department_id,department_name )
when department_id = 50 then
into tbl_emp_dept50(empno, ename, monthsal, gender, manager_id, department_id, department_name)
values(employee_id, fullname,month_sal, gender,manager_id,department_id,department_name)
when department_id = 80 then
into tbl_emp_dept80(empno, ename, monthsal, gender, manager_id, department_id, department_name)
values(employee_id, fullname,month_sal, gender,manager_id,department_id,department_name)
select employee_id
, first_name || ' ' || last_name AS fullname
, nvl(salary + (salary * commission_pct), salary) AS month_sal
, case when substr(jubun,7,1) in('1','3') then '남' else '여' end AS gender
, E.manager_id
, E.department_id
, department_name
from employees E JOIN departments D
on E.department_id = D.department_id
where E.department_id in(30,50,80)
order by E.department_id asc, employee_id asc;
어떤 2개 이상의 테이블에 존재하는 데이터를 다른 테이블 한곳으로 모으는것(병합)이다.
MERGE INTO
이다MERGE [TABLE/VIEW] - update 또는 insert할 테이블 혹은 뷰
INTO[TABLE/VIEW/DUAL] - 비교할 대상 테이블 혹은 뷰(위 테이블과 동일할 경우 DUAL을 사용)
ON [조건]
예> 네이버카페(다음카페)에서 활동
글쓰기(insert)를 1번하면 내포인트 점수가 10점이 올라가고(update),
댓글쓰기(insert)를 1번하면 내포인트 점수가 5점이 올라가도록 한다(update)
위와같이 정의된 네이버카페(다음카페)에서 활동은 insert 와 update 가 한꾸러미(한세트)로 이루어져 있는 것이다.
이와 같이 서로 다른 DML문이 1개의 작업을 이룰때 Transaction(트랜잭션) 처리라고 부른다.
Transaction(트랜잭션) 처리에서 가장 중요한 것은
모든 DML문이 성공해야만 최종적으로 모두 commit 을 해주고,
DML문중에 1개라도 실패하면 모두 rollback 을 해주어야 한다는 것이다.
예를 들면 네이버카페(다음카페)에서 글쓰기(insert)가 성공 했다라면
그 이후에 내포인트 점수가 10점이 올라가는(update) 작업을 해주고, update 작업이 성공했다라면
commit 을 해준다.
만약에 글쓰기(insert) 또는 10점이 올라가는(update) 작업이 실패했다라면
rolllback 을 해준다
commit;
이 되어진다-- TRUNCATE table 테이블명;
을 실행하면 테이블명에 존재하던 모든 행(row)들을 삭제해주고 테이블명에 해당하는 테이블은 완전초기화가 되어진다
중요한 사실은 truncate table 테이블명;
은 DDL문이기에 auto commit;
되어지므로 rollback이 불가하다
-- delete from 테이블명;
을 실행하면 이것도 테이블명에 존재하던 모든 행(row)들을 삭제해준다
이것은 DML문이므로 rollback이 가능하다
truncate table tbl_emp_copy1;
-- Table TBL_EMP_COPY1이(가) 잘렸습니다.
COMMIT;
이 되어진다✅ orauser1에게 자신의 소유인 employees 테이블에 대해 select 할 수 있도록 권한을 부여하기
grant select on employees to orauser1;
-- Grant을(를) 성공했습니다
✅ orauser1에게 HR이 자신의 소유인 employees 테이블에 대해 update 할 수 있도록 권한을 부여하기
grant update on employees to orauser1;
-- Grant을(를) 성공했습니다.
✅ orauser1 에게 HR이 자신의 소유인 employees 테이블에 대해 delete 할 수 있도록 권한을 부여하기
grant delete on employees to orauser1;
-- Grant을(를) 성공했습니다.
⚠️
update employees set salary = 22222
where employee_id = 100;
-- lock 걸림
-- 읽기는 가능
update employees set salary = 22222
where department_id is null;
-- lock 걸림
--- *local_orauser1에서 작업한 것.sql
--update HR.employees set first_name = '스티븐'
--where employee_id = 100;에서 lock이 걸리기 때문에 안됌 ,
-- 커밋 롤백을 안해줘서 그럼, 커밋과 롤백을 꼭 해줘야 함
revoke select on employees to orauser1;
--> orauser1에게 HR이 자신의 소유인 employees 테이블에 대해 select