쌓고 쌓다
[Oracle] UPDATE, DELETE, MERGE 본문
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
'프로그래밍 > SQL' 카테고리의 다른 글
[Oracle] 테이블 생성 및 조작(CREATE, ALTER, DROP TABLE) (0) | 2022.11.27 |
---|---|
[Oracle] 시퀀스(SEQUENCE) (0) | 2022.11.27 |
[Oracle] INSERT (0) | 2022.11.21 |
오라클 중심의 SQL 배움터 9장 연습문제 풀이 (0) | 2022.11.16 |
[Oracle] 서브쿼리 (0) | 2022.11.15 |
Comments