-
day09 - 오라클 (sql 명령어, insert, delete, truncate, drop 차이, merge, commit, DML)KIC/DB 오라클 2021. 7. 10. 23:31반응형
[SQL 명령어들]
DML(Data Manipulation Language): INSERT(입력), UPDATE(변경), DELETE(삭제), MERGE(병합)
DDL(Data Definition Language): CREATE (생성), ALTER (수정), TRUNCATE (잘라 내기), DROP (삭제)
DCL (Data Control Language): GRANT (권한 주기), REVOKE (권한 뺐기)
TCL (Transaction Control Language): COMMIT (확정), ROLLBACK(취소)
SELECT : 어떤 분류에서는 DQL (Data Query Language) 라고 하기도 함
INSERT: 데이터 입력 명령어
INSERT INTO table licolumn1, column2,......)]
VALUES (value 1, value 2.....);
ex)
-- 데이터 하나 추가
--컬럼명을 적어줄 수 도 안적어 줄 수도 있다.
- 컬럼을 적어주면 적어준 컬럼에만 데이터가 들어가고 생략하면 전체 컬럼을 아래에 입력 해야함
INSERT INTO dept2(dcode, dname, pdept, area)
VALUES (9000, '특판1팀', 1006', '임시지역');
-- 이렇게 없이도 가능
INSERT INTO dept2
VALUES(9001, '특판2팀', '1006', '임시지역');
--ex)
-- 특정 칼럼만 입력했을 때
insert into dept2(dcode, dname, pdept)
values(9002, '특판3팀', '1006');
-> 값이 4개중 3개만 넣었기 때문에 마지막 값은 null로 들어간다.
[insert 여러 행 입력]
--1.
create table professor2 as select * from professor;
--2.
create table professor3 as select * from professor where 1 = 2;
--확인
select * from professor2;
select * from professor3;
--3.
insert into professor3
select * from professor;
-> 첫번째 꺼는 professor와 동일한 틀을 만들고 professor의 기존 자료가 모두 들어간다.
-> 두번째 꺼는 틀만 만들기 위해서 값은 안 넣으려고 일부러 거짓인 where 조건문을 작성
-> 이후 세번쨰 쿼리를 이용해서 빈 틀에 professor의 모든 값을 저장
[delete, truncate, drop 차이]
[delete]
-> delete는 트랜잭션 처리를 하지만 truncate는 그렇지 않는다.
-> delete는 삭제되어도 테이블 용량이 줄지 않고, 삭제 후에 잘못 삭제한 것을 되돌릴 수 있다.
-> table이나 cluster에 행이 많으면 행이 삭제될 때마다 많은 system자원이 소모된다.
-> commit 이전에는 롤백이 가능하다.
-> 록백정보를 기록하므로 truncate에 비해서 느리다.
-> 전체 또는 일부만 삭제 가능하다.
-> 삭제 행수를 반환 한다.
[truncate]
-> truncate table
-> 테이블을 최초 생성된 초기상태로 만든다.
-> 용량이 줄어들고, 인덱스 등도 모두 삭제
-> 롤백이 불가능 하다.
-> 무조건 전체 삭제만 가능
-> 삭제 행수를 반환 하지 않는다.
[drop table]
-> 테이블 구조를 제거하는 것
-> 기존 테이블의 존재를 제거한다. (테이블의 정의 자체를 제거한다.)
-> 롤백이 불가능하다.
-> 테이블이 사용했던 storage는 모두 release처리 된다.
[merge]
-> 테이블 합치기
--merge
merge into p_total total
using pt_01 p01
on (total.판매번호 = p01.판매번호)
when matched then
update set total.제품번호 = p01.제품번호
when not matched then
insert values(p01.판매번호, p01.제품번호, p01.수량, p01.금액);
-> p_total에 값이 없기 때문에 p01 값이 그대로 insert 될 것
--merge p02
merge into p_total total
using pt_02 p02
on (total.판매번호 = p02.판매번호)
when matched then
update set total.제품번호 = p02.제품번호
when not matched then
insert values(p02.판매번호, p02.제품번호, p02.수량, p02.금액);
-> p_total을 sqlplus에서 확인해보면 아직 커밋이 안된 것을 확인할 수 있다.
-> 다른 테이블 두개를 연결한 것이기 때문
[commit]
-> 기존 delete는 수행해도 커밋을 자동으로 하지 않는다.
-> DDL을 만나면 자동 오토 commit이 된다.
-> 정상적인 exit 한 경우 자동 커밋
--커밋용 ddl문
create table rolluptest(
num number(10),
name varchar2(2()));
-> 위의 DDL 문을 수행했더니 이전에 없던 p_total 테이블이 커밋되어 출력된다.
--DML 예제
insert into rolluptest values
(round(dbms_random.values(1,45),0),
dbms_random.String('A',9));
-> DML로 랜덤값을 추가해주었지만
-> DML만 만났을 땐 커밋이 되지 않아 SQLPLUS에서는 출력이 되지 않는 것을 확인할 수 있다.
[savepoint]
-> savepoint: 트랜잭션을 여기까지 수행하겠다.
-> 4개를 insert하고 savepoint를 적용한 후에 2개를 추가로 insert했을 때
--insert
insert into rolluptest values
(round(dbms_random.value(1,45),0),
dbms_random.String('A',9));
select * from rolluptest;
--2개까지 insert하고 savepoint
--2개 추가로 insert
rollback to a1;
-> 기존에 4개가 select 되었으나 롤백 이후에 savepoint가 지정되었던 2개로 롤백되어 출력된다.
300x250'KIC > DB 오라클' 카테고리의 다른 글