개발자 미니민의 개발스터디

[Oracle] 오라클 - DML (데이터 수정, 삭제 UPDATE/DELETE/MERGE)

by mini_min
[Oracle]
오라클 - DML (데이터 수정, 삭제 UPDATE/DELETE/MERGE)

✔️ 데이터 수정 UPDATE

데이터를 수정하고 싶을 때 사용하는 조작어

❌ 아래 처럼 제약 조건을 위반하면 수정이 불가하다.

UPDATE emp_score SET empNo='2222' WHERE empNo='1001';
    --무결성 제약 조건 위반.  부모키가 없습니다.
💡 부모 테이블에 없는 값은 추가 불가하다. (아버지가 없는 값을 가질 수 없음)
= 무조건 모든 값이 수정되는건 아니다. 

 

 

-- 기본형식

UPDATE 테이블명 SET 컬럼=값, 컬럼=값 WHERE 조건;
UPDATE 테이블명 SET 컬럼=값, 컬럼=값;   -- 모든레코드 수정
💡 조건을 안주고 수정해버리면, 모든 데이터가 수정될 수 있다. 
조건 꼭 필요!!

 

 

-- UPDATE 조건에 서브쿼리 이용! (개발부 사람들 엑셀 점수만 +100점)

UPDATE emp_score SET excel = excel+100
        WHERE empNo IN (SELECT empNo FROM emp WHERE dept = '개발부');

 

 

-- 서브쿼리로 값 UPDATE 

값 부분에 서브쿼리를 줘서 변경도 가능하다.

UPDATE emp_score SET (excel, word) = (SELECT 100, 100 FROM dual)
	WHERE empNo = '1001'

 

 

 

✔️ 데이터 삭제 DELETE

데이터를 삭제할 때 사용하는 것. (DROP 과 다름)

❌ 당연하게도, 조건 안주고 삭제하면 큰일남...

❌ 관계가 맺어져있을 때 삭제 못하는 경우도 있다.

ex) 자식 레코드가 있는데 부모 레코드 삭제 불가

 

-- 기본형식

DELETE FROM 테이블명 WHERE 조건;
DELETE FROM 테이블명;  -- 모든레코드 삭제
DELETE FROM emp1 WHERE dept= '영업부';

 

 

-- 서브쿼리 사용해서 삭제 조건 줄 수 있음

CREATE TABLE emp1 AS SELECT * FROM emp;
CREATE TABLE emp_score1 AS SELECT * FROM emp_score;

DELETE FROM emp_score1  WHERE empNo IN (SELECT empNo FROM emp1 WHERE dept='개발부');

 

 

-- 모든 데이터 삭제 : 구조는 삭제 안됨

DELETE FROM emp1;

 

 

 

✔️ 데이터 삭제한 경우 복구

-- @@분 전의 데이터를 확인해서 복구할 수 있다. 

-- 20분 전의 테이블 확인
SELECT * FROM emp
            AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '20' MINUTE);
            
-- 20분 전 테이블로 복구
INSERT INTO emp (
        SELECT * FROM emp
            AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '20' MINUTE)
            WHERE city = '서울'
        );

 

 

 

✔️ MERGE 데이터 병합

-- 기본형식

MERGE INTO 대상테이블명
           USING 비교할테이블 ON ( 조건 )
             WHEN MATCHED THEN
                 UPDATE SET 컬럼=값, 컬럼=값
            WHEN NOT MATCHED THEN
                INSERT [ (컬럼, 컬럼) ] VALUES (값, 값)
             ;

 

 

-- 예제

	CREATE TABLE emp1 AS
        SELECT empNo, name, city, dept, sal FROM emp WHERE city='인천';
        
    CREATE TABLE emp2 AS
        SELECT empNo, name, city, dept, sal FROM emp WHERE dept='개발부';
💡 emp1 과 emp2 를 empNo 로 비교하여 
EMP1 과 emp2 테이블에 모두 존재하는 레코드는 emp1 테이블의 sal에 누적하고
emp2에만 존재하는 경우 emp1 테이블에 추가
--별명 사용 가능 e1 : 대상 / e2 : 비교할 것 또는 서브쿼리 / on : 조건

MERGE INTO emp1 e1
           USING emp2 e2 ON ( e1.empNo = e2.empNo )
           WHEN MATCHED THEN
                 UPDATE SET e1.sal = e1.sal + e2.sal
            WHEN NOT MATCHED THEN
                INSERT (e1.empNo, e1.name, e1.city, e1.dept, e1.sal) 
                    VALUES (e2.empNo, e2.name, e2.city, e2.dept, e2.sal);
💡 누적하는 경우 UPDATE
추가하는 경우 INSERT

 

 

 

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기