insert, update, delete
작업을 하나의 명령어로 한번에 수행하는 DML(Data Manipulation Language)문
insert, update, delete, merge, select
@demo
select ename, loc
from emp e, dept d
where e.deptno = d.deptno;
alter table emp
add loc varchar2(20);
merge into emp e
using dept d
on (e.deptno = d.deptno)
when matched then
update set e.loc = d.loc;
ㄴ 💡 역정규화
alter table emp
add dname varchar2(20);
merge into emp e
using dept d
on (e.deptno = d.deptno)
when matched then
update set e.dname = d.dname;
select ename, sal, ( select sum(sal) from emp where job='SALESMAN' ) 토탈월급,
( select max(sal) from emp where job='SALESMAN' ) 최대월급,
( select min(sal) from emp where job='SALESMAN' ) 최소월급
from emp;
select ename, sal,
( select sum(sal) from emp where job='SALESMAN') as 토탈월급,
( select max(sal) from emp where job='SALESMAN') as 최대월급,
( select min(sal) from emp where job='SALESMAN') as 최소월급
from emp;
select ename, sal, substr(total, 1, 10) as 토탈월급,
substr(total, 11, 10) as 최대월급,
substr(total, 21, 10) as 최소월급
from (
select ename, sal,
( select rpad(sum(sal),10,' ') || rpad(max(sal),10,' ') || rpad(min(sal),10,' ')
from emp
where job='SALESMAN') total
from emp
);
alter table emp21
add t_price number(10);
merge into emp21 e
using telecom_table t
on (e.telecom = t.telecom)
when matched then
update set e.t_price = t.t_price;
select telecom, t_price from emp21;
select e.ename, e.sal, s.grade
from emp e, salgrade s
where e.sal between s.losal and s.hisal;
-- grade 컬럼의 유형 조회
desc salgrade;
-- 컬럼유형을 똑같이 맞춰서 add 해줌
alter table emp
add grade number(10);
select * from emp;
merge into emp e
using salgrade s
on (e.sal between s.losal and s.hisal)
when matched then
update set e.grade = s.grade;
select ename, grade
from emp;
rollback;
-- 또는
select ename, grade
from emp;
update emp
set grade = null;
update emp e
set grade = ( select grade
from salgrade s
where e.sal between s.losal and s.hisal );
select ename, grade
from emp;
💡 위의 update 문장은 emp테이블의 갯수만큼 update가 수행됨. 그래서 emp 테이블의 갯수가 많으면 더 오래걸림 -->
튜닝 전 SQL
--> merge문은 1번 갱신하고 끝남
-- loc 컬럼 유형 조회
desc dept;
alter table emp
add loc varchar2(13);
select ename, loc
from emp;
merge into emp e
using dept d
on (e.deptno = d.deptno)
when matched then
update set e.loc = d.loc;
-- 잘 갱신되었는지 확인
select ename, loc from emp;
-- 튜닝 전 SQL
update emp e
set loc = ( select loc
from dept d
where e.deptno = d.deptno );
alter table emp
add dname varchar2(20);
select ename, dname from emp;
update emp e
set dname = ( select dname
from dept d
where d.deptno = e.deptno );
merge into emp e
using dept d
on (d.deptno = e.deptno)
when matched then
update set e.dname = d.dname;
create table emp_test
as
select *
from emp;
select * from emp_test;
create table emp21_backup
as
select *
from emp21;
select * from emp21_backup;
update emp_test
set sal = 0, comm = 0;
commit;
select * from emp_test;
delete from emp_test
where job in ('ANALYST', 'SALESMAN');
OLTP 서버 —————————> OLAP 서버
(emp 테이블) -------- (emp_test 테이블)
merge와 insert를 한번에
merge into emp_test t
using emp e
on (e.empno = t.empno)
when matched then
update set t.ename = e.ename,
t.job = e.job,
t.mgr = e.mgr,
t.hiredate = e.hiredate,
t.sal = e.sal,
t.comm = e.comm,
t.deptno = e.deptno
when not matched then
insert ( t.empno, t.ename, t.job, t.mgr, t.hiredate, t.sal, t.comm, t.deptno )
values ( e.empno, e.ename, e.job, e.mgr, e.hiredate, e.sal, e.comm, e.deptno );
create table emp21_test
as
select *
from emp21;
update emp21_test
set age= null, email=null;
delete from emp21_test
where empno in ( 11, 12);
commit;
merge into emp21_test t
using emp21 e
on (e.empno = t.empno)
when matched then
update set t.ename = e.ename,
t.age = e.age,
t.birth = e.birth,
t.telecom = e.telecom,
t.major = e.major,
t.email = e.email,
t.address = e.address,
t.t_price = e.t_price
when not matched then
insert ( t.empno, t.ename, t.age, t.birth, t.telecom, t.major, t.email, t.address, t.t_price )
values ( e.empno, e.ename, e.age, e.birth, e.telecom, e.major, e.email, e.address, e.t_price );
select * from emp21_test;