[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
'SQL쿼리' 카테고리의 다른 글
[Oracle] 오라클 - 데이터 제약 조건 / 기본키 설정 (0) | 2022.08.10 |
---|---|
[Oracle] 오라클 - 데이터 딕셔너리 (Data Dictionary) (0) | 2022.08.10 |
[Oracle] 오라클 - DML ( 데이터 추가 INSERT/서브쿼리/다중행 추가) (0) | 2022.08.10 |
[Oracle] 오라클 - DDL (컬럼 변경, 추가, 논리적 삭제 ALTER/DROP) (0) | 2022.08.10 |
[Oracle] 오라클 - DDL (테이블 생성 CREATE/가상컬럼/서브쿼리) (0) | 2022.08.10 |
블로그의 정보
개발자 미니민의 개발로그
mini_min