DML(Data Manupulation Language)
- 테이블에 새로운 데이터를 입력하거나 기존 데이터를 수정 또는 삭제하기 위한 명령어
- 종류: INSERT, UPDATE, DELETE, MERGE
INSERT
단일 행 입력
-- 컬럼명 생략
INSERT INTO student
VALUES(1011, '홍길동', 'hong', 1, '8501011143098', '85/01/01', '041-630-3114', 170, 70, 101, 9903);
-- 컬럼명 명시
-- 날짜형식을 '85/01/01' 이렇게 넣을 수 있음. 단 버전 별로 안될수도 있으니 TO_DATE('2006/01/01','YYYY/MM/DD') 이 방식도 알아야함!
INSERT INTO PROFESSOR(profno, name, position, hiredate, deptno)
VALUES(9920, '최윤식', '조교수', TO_DATE('2006/01/01','YYYY/MM/DD'), 102);
다중 행 입력
방법 1) SELECT 조건으로 넣어주기
INSERT INTO MMSUM30 (SUM_YYMM, ITEM_CODE, ITEM_GUBN, STCK_QTY, SawonID, RegiDate)
(SELECT p_sum_yymm, ITEM_CODE, '0', STCK_QTY, SawonID, SYSDATE
FROM MMSUM30
WHERE SUM_YYMM = TO_CHAR(ADD_MONTHS(TO_DATE(p_sum_yymm, 'YYYYMM'), -1), 'YYYYMM')
AND ITEM_GUBN = '1');
방법 2) INSERT ALL
: 서브쿼리의 결과 집합을 여러 테이블에 동시에 입력
-- ex1)
INSERT ALL
INTO height_info VALUES(studno, name, height)
INTO weight_info VALUES(studno, name, weight)
SELECT studno, name, height, weight
FROM student
WHERE grade >= 2;
-- ex2)
INSERT ALL
WHEN height > 170 THEN
INTO height_info VALUES(studno, name, height)
WHEN weight >70 THEN
INTO weight_info VALUES(studno, name, weight)
SELECT studno, name, height, weight
FROM student
WHERE grade >= 2;
방법 3) INSERT FIRST
조건을 지정하여 조건에 만족하는 첫번째 테이블에 값을 우선적으로 입력하기 위한 명령문
서브쿼리의 결과 집합중에서 조건을 만족하는 첫 번째 WHEN절에서 지정한 테이블에만 입력하고 나머지 WHEN절 무시
INSERT FIRST
WHEN height > 170 THEN
INTO height_info VALUES(studno, name, height)
WHEN weight > 70 THEN
INTO weight_info VALUES(studno, name, weight)
SELECT studno, name, height, weight
FROM student
WHERE grade >= 2;
PIVOTING INSERT
- OLTP(OnLine Transaction Processing) 업무에서 사용되는 데이터를 데이터웨어하우스 업무에서 사용되는 분석용 데이터로 변환하는 경우에 유용
- PIVOTING INSERT 명령문을 사용하여 SALES 테이블의 요일별 데이터를 통합하여 SALES_DATA 테이블에 하나의 행으로 입력
-- 알아두자. => 데이터를 다양하게 조작할 수 있는 테이블!
INSERT ALL
INTO sales_data VALUES(sales_no, week_no, '1', sales_mon)
INTO sales_data VALUES(sales_no, week_no, '2', sales_tue)
INTO sales_data VALUES(sales_no, week_no, '3', sales_wed)
INTO sales_data VALUES(sales_no, week_no, '4', sales_thu)
INTO sales_data VALUES(sales_no, week_no, '5', sales_fri)
SELECT sales_no, week_no, sales_mon, sales_tue, sales_wed, sales_thu, sales_fri
FROM sales;
UPDATE
WHERE로 조건을 꼭! 줘야함.
-- ex1)
UPDATE professor
SET position = '부교수',
sal = 390
WHERE profno = 9903;
-- ex2)
UPDATE student
SET(grade, deptno) = (SELECT grade, deptno
FROM student
WHERE studno = 10103)
WHERE studno = 10201;
DELETE
-- ex1)
DELETE student
WHERE studno = 20103;
-- ex2)
DELETE student
WHERE deptno = (SELECT deptno
FROM department
WHERE dname = '컴퓨터공학과');
Merge
구조가 같은 두개의 테이블을 비교하여 하나의 테이블로 합치기 위한 데이터 조작어
CREATE TABLE professor_temp AS
SELECT *
FROM professor
WHERE position = '교수';
UPDATE PROFESSOR_TEMP
SET position = '명예교수'
WHERE position = '교수';
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);