사용할 테이블
SELECT * FROM DEPT;
DML 문이란 관리할 자료들을 테이블에 입력, 수정, 삭제하는 문이다.
가. 단일행 INSERT 문
단일 행 INSERT 문은 VALUES 절을 포함하며, 한 번에 한 행만 입력된다.
INSERT INTO 테이블명[(칼럼1, 칼럼2, ...)] VALUES (값1, 값2, ...);
INTO 절의 칼럼명과 VALUES 절의 값을 서로 1대1로 매핑해 기술한다.
기술 순서는 테이블 칼럼 순서와 동일할 필요는 없으며, INTO 절에 기술하지 않은 칼럼은 Default로 NULL값이 입력된다. 단 Primary Key 제약 또는 Not NULL 제약이 있을 경우 NULL 값은 에러가 뜬다.
해당 칼럼의 데이터 유형이 CHAR이나 VARCHAR2 등 문자유형이면 '와 같이 값을 입력한다. 숫자 유형일 경우에는 '없이 입력한다.
INSERT INTO DEPT (DEPTNO)
VALUES(50);
나. 서브 쿼리를 이용한 다중 행 INSERT 문
INSERT 문에 서브 쿼리를 사용하면 서브 쿼리의 결과를 테이블에 입력할 수 있다.
서브 쿼리의 결과가 다중 행이면, 한 번에 여러 건이 입력된다. 단 INTO 절의 칼럼명 개수와 서브 쿼리의 SELECT 절 칼럼 개수가 일치해야 한다.
INSERT INTO 테이블명[(칼럼1, 칼럼2, ...)] 서브 쿼리;
INSERT INTO DEPT (DEPTNO, LOC)
SELECT 25, 'YORK' FROM DUAL;
입력한 데이터 중에 잘못 입력되거나 변경이 발생해 데이터를 수정해야 하는 경우가 발생할 수 있다. UPDATE는 데이터를 수정할 때 사용한다.
UPDATE 테이블명 SET 수정할 칼럼명1 = 수정될 새로운 값1 [, 수정할 칼럼명2 = 수정될 새로운 값2] [, ...] [WHERE 수정 대상 식별 조건식 ];
UPDATE DEPT
SET DNAME = 'HI'
WHERE DEPTNO = 25;
UPDATE 문의 SET 절에 서브 쿼리를 사용하면, 서브 쿼리의 결과로 값이 수정된다. 단 서브 쿼리의 결과가 NULL을 반환할 경우 해당 칼럼의 결과가 NULL이 될 수 있어서 주의해야 한다.
UPDATE 테이블명 SET (수정할 칼럼명1, 수정할 칼럼명2) = (서브쿼리) [WHERE 수정 대상 식별 조건식 ];
UPDATE DEPT
SET (DNAME, LOC) = (SELECT DNAME, LOC
FROM DEPT
WHERE DEPTNO = 20)
WHERE DEPTNO = 50;
테이블에 저장된 데이터가 더이상 필요 없게 됐을 경우 데이터 삭제를 수행한다.
DELETE [FROM] 테이블명 [WHERE 삭제 대상 식별 조건식]
DELETE DEPT
WHERE DEPTNO = 50;
새로운 행을 입력하거나, 기존 행을 수정하는 작업을 한번에 할 수 있다.
ON절의 조인 조건에 따라 성공한 행들에 대해서는 WHEN MATCHED THEN 아래 UPDATE 구문을 수행하고, 조인에 실패한 행들에 대해서는 WHEN NOT MATCHED THEN 아래 INSERT 구문을 수행한다.
MERGE INTO 타켓 테이블명 USING 소스테이블명 ON (조인 조건식) WHEN MATCHED THEN UPDATE SET 수정할 칼럼명1 = 수정될 새로운 값1 [, 수정할 칼럼명2 = 수정될 새로운 값2] [, ...] WHEN NOT MATCHED THEN INSERT [(칼럼1, 칼럼2, ...)] VALUES (값1, 값2, ...);
MERGE
INTO DEPT A
USING DEPT B
ON (A.DEPTNO = B.DEPTNO)
WHEN MATCHED THEN
UPDATE
SET DNAME = 'BYE'
, LOC = 'ORACLE'
WHEN NOT MATCHED THEN
INSERT (DEPTNO, DNAME, LOC)
VALUES (60, 'GOOD', 'SQL');
MERGE
INTO DEPT A
USING DUAL B
ON (A.DEPTNO = 70)
WHEN MATCHED THEN
UPDATE
SET DNAME = 'BYE'
, LOC = 'ORACLE'
WHEN NOT MATCHED THEN
INSERT (DEPTNO, DNAME, LOC)
VALUES (60, 'GOOD', 'SQL');
USING절에 소스 테이블 대신 서브 쿼리를 사용해 입력 수정할 수도 있다.