쌓고 쌓다

[Oracle] UPDATE, DELETE, MERGE 본문

프로그래밍/SQL

[Oracle] UPDATE, DELETE, MERGE

승민아 2022. 11. 24. 18:04

UPDATE

UPDATE table
SET column1=value [, column2=value, ...]
[WHERE condition]

테이블에 저장된 데이터 수정을 위한 조작어이다.

조건절을 생략하면 테이블의 모든 행을 수정한다.

 

EX) 단일행 수정

--학번이 10108인 학생의 생년월일을 '81/10/13', 주민번호를 '7777'로 수정
UPDATE student
SET birthdate =  '81/10/13',
    idnum = '7777'
WHERE studno = 10108;

 

서브쿼리를 이용한 데이터 수정

UPDATE table1
SET (column1, column2, ...) = (SELECT s_column1, s_column2, ...
                               FROM table2
                               [WHERE condition2])
[WHERE condition1];

다른 테이블에 저장된 데이터 검색하여 한꺼번에 데이터를 수정.

SET절의 칼럼 이름과 서브쿼리의 칼럼 이름이 일치할 필요는 없다.

단, 데이터 타입과 칼럼 수는 일치해야한다.

 

EX1)

-- '최윤식' 교수의 급여와 보직수당을 '백미선' 교수의 급여와 보직수당과 동일하게 수정.
UPDATE professor
SET (sal, comm) = (SELECT sal, comm
                   FROM professor
                   WHERE name='백미선')
WHERE name = '최윤식';

 

EX2)

-- '기계공학과'에 속한 학생의 지도 교수 번호를 '남은혁' 교수의 교수 번호로 수정
UPDATE student
SET profno = (SELECT profno
              FROM professor
              WHERE name='남은혁')
WHERE deptno = (SELECT deptno
                FROM department
                WHERE dname='기계공학과');

 

DELETE

DELETE [FROM] table
[WHERE condition];

테이블에 저장된 데이터 삭제를 위한 조작어

WHERE절을 생략하면 테이블의 모든 행 삭제

 

EX)

-- 학생 테이블에서 학번이 10110인 학생의 데이터 삭제
DELETE
FROM student
WHERE studno=10110;

 

서브쿼리를 이용한 데이터 삭제

DELETE FROM table
WHERE (column1, column2, ...) = (SELECT s_column1, s_column2, ...
                                 FROM table2
                                 [WHERE condition2])

 

EX)

-- 교수 테이블에서 환경보건학과에 소속된 교수를 모두 삭제
DELETE
FROM professor
WHERE deptno = (SELECT deptno
                FROM department
                WHERE dname='환경보건학과');

 

MERGE

구조가 같은 두개의 테이블을 비교하여 하나의 테이블로 합치기 위한 데이터 조작어

MERGE INTO [table] [alias]
USING [table|view|subquery] alias
ON [join condition]
WHEN MATCHED THEN
    UPDATE SET ...
WHEN NOT MATCHED THEN
    INSERT INTO ...
    VALUES ...;
  • MERGE INTO : 하나의 테이블로 합치기위한 결과 테이블(테이블1)
  • USING : 합쳐질 테이블 (테이블2)
  • ON : 조인 조건
  • WHEN MATCHED THEN : ON 조건으로 일치하는 행이 존재하면 지정된 값으로 UPDATE
  • WHEN NOT MATCHED THEN : ON 절의 조인 조건을 만조하지 않을경우 새로운 행으로 INSERT

 

EX)

-- professor 테이블과 professor_temp 테이블을 비교하여 professor 테이블에 있는 기존 데이터는
-- professor_temp 테이블의 데이터에 의해 수정하고, professor 테이블에 없는 데이터는 신규로 입력하라.

-- 직급 '교수'인 데이터를 professor_temp에 저장
CREATE TABLE professor_temp AS
SELECT *
FROM professor
WHERE position = '교수';


-- professor_temp의 '교수' 직급을 '명예교수'로 수정
UPDATE professor_temp
SET position = '명예교수'
WHERE position = '교수';

-- professor_temp에 '김도경' 삽입
INSERT INTO professor_temp
VALUES (9999, '김도경', 'arom21', '전임강사', 200,
        SYSDATE, 10, 101);
        
MERGE INTO professor p
USING professor_temp f
ON (p.profno=f.profno)
WHEN MATCHED THEN
     UPDATE SET p.position = f.position
WHEN NOT MATCHED THEN
     INSERT VALUES(f.profno, f.name, f.userid, f.position,
                   f.sal, f.hiredate, f.comm, f.deptno);

=> p 테이블과 f 테이블의 profno가 일치하면 p의 position을 f.position으로 바꾼다.

일치하지 않으면 f 테이블(USING의 테이블)의 행을 p에 INSERT

Comments