데이터 조작 언어로 테이블에 값을 삽입(INSERT), 수정(UPDATE), 삭제(DELETE)하는 구문을 말함
✓ 예시
INSERT INTO EMPLOYEE
VALUES(1, ‘홍길동’, ‘820114-1010101’, ‘hong_kd@kh.or.kr’, ‘01099998888’, ‘D5’, ‘J2’, ‘S4’, 3800000, NULL, ‘200’, SYSDATE, NULL, DEFAULT);
UPDATE EMPLOYEE
SET EMP_ID = 290
WHERE EMP_NAME = ‘홍길동’;
DELTE FROM EMPLOYEE
WHERE EMP_NAME = ‘홍길동’;
테이블에 새로운 행을 추가하여 테이블의 행 개수를 증가시키는 구문
✓ INSERT 예시1
INSERT INTO EMPLOYEE (EMP_ID, EMP_NAME, EMP_NO, EMAIL, PHONE, DEPT_CODE, JOB_CODE, SAL_LEVEL, SALARY, BONUS, MANAGER_ID, HIRE_DATE, ENT_DATE, ENT_YN)
VALUES(900, '장채현', '901123-1080503', 'jang_ch@kh.or.kr', '01055569512', 'D1', 'J8', 'S3', 4300000, 0.2, '200', SYSDATE, NULL, DEFAULT);
또는
INSERT INTO EMPLOYEE VALUES(900, '장채현', '901123-1080503', 'jang_ch@kh.or.kr', '01055569512', 'D1', 'J8', 'S3', 4300000, 0.2, '200', SYSDATE, NULL, DEFAULT);
* INSERT하고자 하는 컬럼이 모든 컬럼인 경우 컬럼명 생략 가능. 단, 컬럼의 순서를 지켜서 VALUES에 값을 기입해야 함
✓ INSERT 예시2
CREATE TABLE EMP_01(
EMP_ID NUMBER,
EMP_NAME VARCHAR2(30),
DEPT_TITLE VARCHAR2(20)
);
INSERT INTO EMP_01(
SELECT EMP_ID,
EMP_NAME,
DEPT_TITLE
FROM EMPLOYEE
LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
);
* INSERT 시 VALUES 대신 서브쿼리 이용 가능
INSERT 시 서브쿼리가 사용하는 테이블이 같은 경우 두 개 이상의 테이블에 INSERT ALL을 이용하여 한 번에 삽입 가능
단, 각 서브쿼리의 조건절이 같아야 함
✓ INSERT ALL 예시1
CREATE TABLE EMP_DEPT_D1
AS SELECT EMP_ID, EMP_NAME, DEPT_CODE, HIRE_DATE
FROM EMPLOYEE
WHERE 1 = 0;
CREATE TABLE EMP_MANAGER
AS SELECT EMP_ID, EMP_NAME, MANAGER_ID
FROM EMPLOYEE
WHERE 1 = 0;
INSERT ALL
INTO EMP_DEPT_D1 VALUES(EMP_ID, EMP_NAME, DEPT_CODE, HIRE_DATE)
INTO EMP_MANAGER VALUES(EMP_ID, EMP_NAME, MANAGER_ID)
SELECT EMP_ID, EMP_NAME, DEPT_CODE, HIRE_DATE, MANAGER_ID
FROM EMPLOYEE
WHERE DEPT_CODE = ‘D1’;
✓ INSERT ALL 예시2
CREATE TABLE EMP_OLD AS SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY
FROM EMPLOYEE
WHERE 1 = 0;
CREATE TABLE EMP_NEW AS SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY
FROM EMPLOYEE
WHERE 1 = 0;
INSERT ALL
WHEN HIRE_DATE < ‘2000/01/01’ THEN
INTO EMP_OLD VALUES(EMP_ID, EMP_NAME, HIRE_DATE, SALARY)
WHEN HIRE_DATE >= ‘2000/01/01’ THEN
INTO EMP_NEW VALUES(EMP_ID, EMP_NAME, HIRE_DATE, SALARY)
SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY
FROM EMPLOYEE;
테이블에 기록된 컬럼의 값을 수정하는 구문으로 테이블의 전체 행 개수에는 변화가 없음
✓ UPDATE 예시1
CREATE TABLE DEPT_COPY
AS SELECT * FROM DEPARTMENT;
UPDATE DEPT_COPY
SET DEPT_TITLE = ‘전략기획팀’
WHERE DEPT_ID = ‘D9’;
* WHERE 조건을 설정하지 않으면
모든 행의 컬럼 값이 변경됨
✓ UPDATE 예시2
CREATE TABLE EMP_SALARY
AS SELECT EMP_ID,
EMP_NAME,
DEPT_CODE,
SALARY,
BONUS
FROM EMPLOYEE;
SELECT * FROM EMP_SALARY
WHERE EMP_NAME IN('유재식', '방명수');
UPDATE EMP_SALARY
SET SALARY = (SELECT SALARY
FROM EMP_SALARY
WHERE EMP_NAME='유재식'),
BONUS = (SELECT BONUS
FROM EMP_SALARY
WHERE EMP_NAME='유재식')
WHERE EMP_NAME = '방명수';
* UPDATE 시에도 서브쿼리 이용 가능
✓ UPDATE 예시3
UPDATE EMP_SALARY
SET (SALARY, BONUS) = (SELECT SALARY, BONUS
FROM EMP_SALARY
WHERE EMP_NAME = ‘유재식’)
WHERE EMP_NAME IN (‘노옹철’, ‘전형돈’, ‘정중하’, ‘하동운');
SELECT * FROM EMP_SALARY
WHERE EMP_NAME IN (‘유재식’, ‘노옹철’, ‘전형돈’, ‘정중하’, ‘하동운');
✓ UPDATE 예시4
UPDATE EMP_SALARY
SET BONUS = 0.3
WHERE EMP_ID IN (SELECT EMP_ID
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_ID = DEPT_CODE)
JOIN LOCATION ON(LOCATION_ID = LOCAL_CODE)
WHERE LOCAL_NAME LIKE ‘ASIA%’);
구조가 같은 두 개의 테이블을 하나의 테이블로 합치는 기능 제공
두 테이블에서 지정하는 조건의 값이 존재하면 UPDATE되고 조건의 값이 없으면 INSERT 함
✓ 예시
CREATE TABLE EMPLOYEE_M01
AS SELECT *
FROM EMPLOYEE;
CREATE TABLE EMP_M02
AS SELECT *
FROM EMPLOYEE
WHERE JOB_CODE = ‘J4’;
INSERT INTO EMP_M02
VALUES(999, ‘곽두원’, ‘561016-1234567’, ‘kwack_dw@kh.or.kr’, ‘01011112222’, ‘D9’, ‘J1’, ‘S1’, 9000000, 0.5, NULL, SYSDATE, DEFAULT, DEFAULT);
UPDATE EMP_M02 SET SALARY = 0;
MERGE INTO EMP_M01 USING EMP_M02 ON(EMP_M01.EMP_ID = EMP_M02.EMP_ID)
WHEN MATCHED THEN
UPDATE SET
EMP_M01.EMP_NAME = EMP_M02.EMP_NAME,
EMP_M01.EMP_NO = EMP_M02.EMP_NO,
EMP_M01.EMAIL = EMP_M02.EMAIL,
EMP_M01.PHONE = EMP_M02.PHONE,
EMP_M01.DEPT_CODE = EMP_M02.DEPT_CODE,
EMP_M01.JOB_CODE = EMP_M02.JOB_CODE,
EMP_M01.SAL_LEVEL = EMP_M02.SAL_LEVEL,
EMP_M01.SALARY = EMP_M02.SALARY,
EMP_M01.BONUS = EMP_M02.BONUS,
EMP_M01.MANAGER_ID = EMP_M02.MANAGER_ID,
EMP_M01.HIRE_DATE = EMP_M02.HIRE_DATE,
EMP_M01.ENT_DATE = EMP_M02.ENT_DATE,
EMP_M01.ENT_YN = EMP_M02.ENT_YN
WHEN NOT MATCHED THEN
INSERT VALUES(EMP_M02.EMP_ID, EMP_M02.EMP_NAME, EMP_M02.EMP_NO, EMP_M02.EMAIL,
EMP_M02.PHONE, EMP_M02.DEPT_CODE, EMP_M02.JOB_CODE, EMP_M02.SAL_LEVEL,
EMP_M02.SALARY, EMP_M02.BONUS, EMP_M02.MANAGER_ID, EMP_M02.HIRE_DATE,
EMP_M02.ENT_DATE, EMP_M02.ENT_YN);
SELECT * FROM EMP_M01;
테이블의 행을 삭제하는 구문으로 테이블의 행 개수가 줄어듦
✓ DELETE 예시1
DELETE FROM EMPLOYEE
WHERE EMP_NAME = '장재현';
* WHERE조건을 설정하지 않으면 모든 행 삭제
DELETE FROM DEPARTMENT
WHERE DEPT_ID = 'D1';
* FOREIGN KEY 제약조건이 설정되어 있는 경우 참조되고 있는 값에 대해서는 삭제 불가능
삭제 시 FOREIGN KEY 제약조건으로 컬럼 삭제가 불가능한 경우 제약조건을 비활성화 할 수 있음
✓ DELETE 예시2
DELETE FROM DEPARTMENT
WHERE DEPT_ID = ‘D1’;
ALTER TABLE EMPLOYEE
DISABLE CONSTRAINT EMP_DEPTCODE_FK CASCADE;
DELETE FROM DEPARTMENT
WHERE DEPT_ID = ‘D1’;
ALTER TABLE EMPLOYEE
ENABLE CONSTRAINT EMP_DEPTCODE_FK;
* 비활성화 된 제약 조건을 다시 활성화 시킬 수 있음
테이블 전체 행 삭제 시 사용 하는 DDL로 DELETE보다 수행 속도가 빠르고 ROLLBACK을 통해 복구 불가능
또한 DELETE와 마찬가지로 FOREIGN KEY 제약조건일 때는 적용 불가능하기 때문에 제약 조건을 비활성화 해야 삭제할 수 있음
✓ 예시
TRUNCATE TABLE EMP_SALARY;
SELECT * FROM EMP_SALARY;
* 모든 컬럼이 삭제되긴 하지만 테이블의 구조는 남아있음
ROLLBACK;
* ROLLBACK 후에도 컬럼이 복구되지 않음