티스토리 뷰
12. 데이터 조작 언어(DML문)
오늘은 어떤 데이터를 실행하거나 출력하는 쿼리가 아닌
조작, 즉 변형하는 언어인 DML문(Data Manipulation Language)을 알아보자.
말이 어렵지 사실 데이터를 입력(insert)하고, 수정(update)하고,
삭제(delete)하고, 이를 한번에 수행(merge) 하는 기능이다.
데이터를 다루는 사람에게는 간단하지만 꼭 필요한 기능이기도 하다.
이 모든 DML문이 실제로 적용되길 원한다면 commit; 을 실행해주어야 한다.
만약 변형 전 상태의 데이터로 돌아가고 싶다면 rollback; 을 실행하면 되는데,
commit; 실행 후에는 이전으로 다시 돌아가지 않는다.
insert
insert문은 말 그대로 새로운 데이터를 집어넣는 기능이다.
emp 테이블을 변형해보자!
<원래 emp 테이블>
emp 테이블에 새로운 사원의 이름을 넣고 싶다면 아래와 같이 insert문을 실행한다.
insert into emp(empno, ename, sal)
values( 1234, 'JANE', 3000);
→ "emp테이블의 empno, ename, sal이라는 컬럼(변수)에 1234, 'JANE', 3000이라는 데이터를 넣겠다."라는 뜻이다.
생각보다 상당히 간단하다. 위에서도 언급했지만 추가한 데이터를 확실히 저장하려면
commit;을 해야 한다는 점을 잊지말자. (나중에 TCL문을 다룰때 자세히 설명하겠다)
위의 예제를 통해 알아본 insert문 사용 시 주의할 점은
1. data가 입력되지 않은 컬럼(변수)의 값은 null로 입력된다.
2. 숫자는 싱글 쿼테이션(따옴표: ')을 사용하지 않아도 되지만, 문자와 날짜는 양쪽에 사용해야한다.
라는 것이다.
새로 입력하는 데이터 중 어떤 컬럼(변수)에는 null을 입력하고자 할 때,
위처럼 아에 데이터와 컬럼을 생략해도 되지만 '' 으로 입력해도 된다.
''은 null로 처리되지만 ' '은 null로 처리되지 않는다.(문자열로 인식)
+ 현재 날짜를 insert할 때, sysdate는 사용하지 않는 것이 좋다.
→ sysdate는 날짜 뿐아니라 시/분/초도 입력이 된다.
그래서 검색하면 insert 당시 시/분/초와 현재 시/분/초가 동일하지 않아 조회가 되지 않는다.
(to_date를 사용해서 넣어주는 것이 좋음)
update
update문을 통해 아까 만든 JANE 사원의 월급(sal)데이터를 3000에서 5000으로 변경해보자.
update emp
set sal=5000
where ename='JANE';
→ "emp테이블의 sal(월급)이라는 컬럼(변수)의 값을 5000으로 바꾸는데 ename(이름)이 JANE인 사람에 해당해서 변경해라!"라는 뜻이다.
물론, 기존에 없던 Data도 update문을 통해 추가해줄 수 있다.
직업(job)을 NULL에서 SALESMAN으로 추가해주자.
update emp
set job='SALESMAN'
where ename='JANE';
where가 있으므로 데이터 하나가 아닌, 조건에 해당하는 여러가지 데이터의 값을
변경해줄 수 있다. 허나 마지막에는 꼭 commit; 필히 실행!
◈ 만약 commit을 실행했는데 이전 데이터로 돌아가고 싶다면?
일반적으로 불가능하지만 자신의 ORACLE에 관리자 권한이 있다면 아래의 명령문으로 가능하다.
alter table emp enable row movement;
flashback table emp to timestamp
(systimestamp - interval '5' minute) ;
delete
오늘 만들어본 JANE 사원 관련 데이터를 delete문을 통해 삭제해보자.
delete from emp
where ename='JANE';
정들었던 JANE 사원이 퇴사한 것을 볼 수 있다. 역시 where을 통해 특정 조건의 데이터를 모두 삭제할 수 있다.
실무에서 data를 삭제하는 것은 매우 중요한 일이므로, commit; 실행을 신중히 하자.
merge
merge의 필요성은 작업 시간과도 연결되는데, 보통 코드를 튜닝하는 튜너들이 자주 사용하여 작업시간을 축소시킨다.
작업시간 확인은 set timing on이라는 명령문을 통해 확인할 수 있다.
우선 emp테이블의 data 양을 insert를 통한 자가복제로 늘려보자.
insert into emp
select * from emp;
data set이 통째로 그대로 복제되어 data의 수가 두배가 되었다.
이를 계속 더 실행하여 완전히 데이터를 늘리자. (114,688개의 Data Set으로 늘림)
다음에 알아볼 DDL문의 alter를 통해 emp 테이블에 loc컬럼을 추가하자.
alter table emp
add loc varchar2(20);
이제 update문을 실행하여 emp테이블에 loc컬럼을 추가하고, loc컬럼의 data로는 해당 사원의 부서위치(dept테이블에 있음)를 넣는 작업을 해보자!
set timing on
update emp e
set loc = (select loc
from dept d
where e.deptno = d.deptno);
이를 merge문을 변경한 것은 아래와 같다.
merge into emp e
using dept d
on (e.deptno = d.deptno)
when matched then
update set e.loc = d.loc;
→ "using 다음에는 참고할 테이블이, on 다음에는 참고할 테이블과의 공통점을 쓰고,
when match then은 고정적으로 쓰고, update 다음에는 기존 update문과같이 사용한다.
작업 시간이 5.98초에서 2.91초로 감소하였는데, 본인은 대용량 처리에 능한 sqlplus를 이용하였고,
sqlgate나 orange, toad 같은 프로그램으로 실행 시 확연한 작업시간 차이를 알 수 있다.
(동일한 작업이 39초 → 14초로 단축되기도 함)
대용량에서 변경할 사안이 있다면 꼭 merge를 사용하도록 하자!
=================이 글은 Markdown을 활용해 작성하였습니다=================
'SQL' 카테고리의 다른 글
[SQL] 14. ORACLE SQL의 Data Type (0) | 2018.02.07 |
---|---|
[SQL] 13. 데이터 정의 언어(DDL문) (0) | 2018.02.06 |
[SQL] 11. 레포팅 함수 (0) | 2018.02.02 |
[SQL] 포트폴리오 - Youtube의 Trending(인기 급상승) 동영상의 제목에서 최빈도 단어 확인 (1) | 2018.02.01 |
[SQL] 10. 집합 연산자 (0) | 2018.02.01 |
- Total
- Today
- Yesterday
- 하둡 설치 가이드
- Big Data
- 하둡
- 데이터 분석
- hadoop setup
- hadoop
- 하둡설치
- 하둡2.7
- hadoop 2.7 install
- data
- Data Analysis
- hadoop install
- 하둡설치가이드
- 빅데이터
- hadoop2.7
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |