본문 바로가기
Oracle

Oracle (UP.MERGE.DEL)

by 요리하다그만둠 2022. 6. 15.

UPDATE

테이블에 있는 기존 데이터를 수정할 때 사용하는 문장이 UPDATE문입니다.

UPDATE [스키마.] 테이블명
SET 컬럼1 = 변경값1,
    컬럼2 = 변경값2,
    ...
    WHERE 조건;

이미 입력되어있는 값을 변경하므로, 변경할 테이블 , 칼럼 그리고 변경할 값이 필요합니다.

UPDATE 다음에 변경할 테이블, SET절에 변경할 컬럼과 값, WHERE절에는 변경할 조건을 기술합니다.

SELECT * FROM EX3_1;

 

EX3_1의 테이블의 col2값을 모두 50으로 변경해 보겠습니다.

UPDATE EX3_1 
SET col2 = 50;

입력해보고 다시 출력해보면

변경된 걸 확인할 수 있습니다.

WHERE 절을 이용해서 특정 조건을 넣으면 그곳만 값을 변경 가능하지만 사용하지 않아 모두 변경되었습니다.

 

MERGE

MERGE문은 조건을 비교해서 테이블에 해당 조건에 맞는 데이터가 없으면 INSERT. 있으면 UPDATE를 수행하는 문장입니다. 특정 조건에 따라 어떤 때는 INSERT를, 또 다른 경우에는 UPDATE문을 수행해야 할 때, 과거에는 해당 조건을 처리하는 로직을 별도로 장성해야 했지만. MERGE문이 나온 덕분에 이제 한 문장으로 처리할 수 있게 되었습니다.

 

MERGE INTO [스키마명.] 테이블명
	USING (update나 insert될 데이터 원천)
    	ON (update 될 조건)
WHEN MATCHED THEN
	SET 컬럼1 = 값1, 컬럼2 = 값2, ....
WHERE dpdate 조건
	DELETE WHERE update_delete 조건

 

WHEN NOT MATCHED THEN
    INSERT  (컬럼1, 컬럼2, ...) VALUES (값1, 값2, ...)
    WHERE insert 조건;

실습용 테이블 생성

CREATE TABLE EX3_3 (
employee_id NUMBER,
bonus_amt NUMBER DEFAULT 0);

입력

INSERT INTO EX3_3 (employee_id)
SELECT e.employee_id
FROM employees e, slaes s
WHERE e.employee_id = s.employee_id
AND s.SALES_MONTH BETWEEN '200010' AND '200012'
GROUP BY e.employee_id;

 

 

DELETE

테이블에 있는 데이터를 삭제할 때 DELETE 문을 사용합니다.

1. 일반구문
DELETE [FROM.] 테이블명
WHERE DELETE 조건;

2. 특정 파티션만 삭제할 경우의 구문
DELETE [FROM] [스키마.]테이블명 PARTITION (파티션명)
WHERE delete 조건;

 

DELETE ex3_3;

 

SELECT * FROM ex3_3 ORDER BY employee_id;

앞에서 본 파티션 테이블은 특정 파티션만 삭제할 수 있으며, 이때 'PARTITION(파티션명)'을 추가로 기술해 준다. 파티션명은 USER_TAB_PARTITIONS 시스템 뷰를 조회하면 찾아낼 수 있습니다.

 

COMMIT, ROLLBACK, TRUNCATE

COMMIT와 ROLLBACK

COMMIT는 변경한 데이터를 데이터베이스에 마지막으로 반영하는 역할을, ROLLBACK은 그 반대로 변경한 데이터를 변경하기 이전 상태로 되돌리는 역할을 합니다.

COMMIT [WORK] [TO SAVEPOINT 세이브 포인트명]
ROLLBACK [WORK] [TO SAVEPOINT 세이브 포인트명]

UPDATE,INSERT,MERGE,DELETE문을 실행하면 데이터에 변화가 생깁니다. 하지만 영구적으로 변경되는것은 아닙니다.

예제용 테이블 생성

CREATE TABLE EX3_4 (
employee_id NUMBER);

 

 

INSERT INTO EX3_4 VALUES (100);

 

SELECT * FROM EX3_4;

 

조회가 가능한데 명령 프롬프트로 접속해서 조회했을떄 조회가 되지않는다.

 

오라클을 비롯한 RDBMS 시스템은 트랜잭션 기능을 지원하는데, COMMIT이나 ROLLBACK문을 실행하기 전까지 변경된 데이터는 현재 세션에만 볼 수 있고 최종적으로 데이터베이스에 반영된 상태가 아닙니다. 따라서 다른 세션에서 보면 EX3_4 테이블에 데이터가 없는 것입니다. COMMIT을 실행 하면 데이터가 반영되고 ROOLLBACK을 실행하면 변경 전의 상태로 복귀 합니다. 

 

COMMIT;

 

커밋을 하니 정상적으로 출력이됩니다.

 

TRUNCATE문

데이터를 삭제할 때는 DELETE 문을 사용하는데 이와 같은 기능을 수행하는 문장이 바로 TRUNCATE문입니다.

DELETE문은 데이터를 삭제한 후에 COMMIT을 실행해야 데이터가 완전히 삭제되고 반대로 ROLLBACK을 실행하면 데이터가 삭제되기 전으로 복귀됩니다. 하지만 DDL문에 속하는 ***** TRUNCATE문은 한번 실행하면 데이터가 바로 삭제되고 ROLLABCK을 실행하더라도 삭제 전 상태로 복귀되지 않습니다. (테이블 데이터 전체가 바로 삭제됨.)

TRUNCATE TABLE [스키마명.] 테이블명;

 

TRUNCATE TABLE EX3_4;

 

 

 

'Oracle' 카테고리의 다른 글

Oracle 의사컬럼, 연산자, 표현식, 조건식  (0) 2022.06.16
Oracle 그룹함수.연산자  (0) 2022.06.16
Oracle (SELECT/INSERT)  (0) 2022.06.14
Oracle Datetype  (0) 2022.06.09
Oracle ER Diagram 생성하기  (0) 2022.06.09