포스트

05. DML(INSERT, UPDATE, DELETE)

DML(Data Manipulation Language)

  • 데이터 조작 언어러 테이블에 값을 추가, 수정, 삭제하는 구문

1) INSERT

  • 테이블에 새로운 행을 추가하여 테이블의 행 개수를 증가시키는 구문
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
-- [작성법]
< INSERT INTO `테이블명` 
VALUES (`데이터`, `데이터`, `데이터`); >
-- 테이블의 모든 컬럼에 값을 추가할 때 사용, 컬럼의 순서를 지켜서 데이터 입력 

INSERT INTO EMPLOYEE
VALUES(900, '홍길동', '123456-7890123', 'hong@test.com', 
'010-1234-5678', 'D1', 'J8', 'S3', 4300000, 0.2, '200', 
SYSDATE, NULL, 'N');



< INSERT INTO `테이블명`(`컬럼명1`, `컬럼명2`..)
VALUES (`데이터1`, `데이터2`, `데이터3`..); >
-- 테이블 중 내가 원하는 컬럼에만 값을 추가할 때 사용
-- 선택되지 않은 컬럼은 NULL 혹은 DEFAULT 값이 입력

INSERT INTO EMPLOYEE(EMP_ID, EMP_NAME, EMP_NO)
VALUES(900, '홍길동', '123456-7890123');



< `서브 쿼리를 이용한` INSERT >
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));

2) UPDATE

  • 테이블에 기록된 컬럼의 값을 수정하는 구문
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
-- [작성법]
< UPDATE `테이블명` SET `컬럼명` = `바꿀값`
[WHERE `컬럼명 비교연산자 비교값`]; >
-- WHERE에서 컬럼과 조건을 정한다. 
-- WHERE 조건이 없으면 컬럼의 전체 값을 수정

UPDATE DEPARTMENT SET DEPT_TITLE = '전략기획팀'
WHERE DEPT_ID = 'D9';

UPDATE EMPLOYEE SET BONUS = 0.1
WHERE BONUS IS NULL;



< `여러 컬럼을 한번에 수정할 시 콤마(,)로 컬럼을 구분` >
UPDATE DEPARTMENT SET 
DEPT_ID = 'D0',
DEPT_TITLE = '전략기획2팀'
WHERE DPET_ID = 'D9'
AND DEPT_TITLE = '전략기획팀';



< `서브 쿼리를 이용한` UPDATE >
-- [작성법]
UPDATE `테이블명`
SET `컬럼명` = (`서브쿼리`)

UPDATE EMPLOYEE SET
SALARY = (SELECT SALARY FROM EMPLOYEE WHERE EMP_NAME = '유재식'), 
BONUS = (SELECT BONUS FROM EMPLOYEE WHERE EMP_NAME = '유재식')
WHERE EMP_NAME = '방명수';

3) MERGE

  • 병합 : 구조가 같은 두 개의 테이블을 하나로 합치는 기능
  • 테이블에서 지정하는 조건의 값이 존재하면 UPDATE가 되고 조건의 값이 없으면 INSERT 됨
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
CREATE TABLE EMP_M01
AS SELECT * FROM EMPLOYEE;

CREAETE 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', 'J4', 'S1', 9000000, 0.5, NULL,
SYSDATE, NULL, DEFAULT);

SELECT * FROM EMP_M01; -- 23명
SELECT * FROM EMP_M02; -- 5명(기존4명 + 신규 1명)
					   -- (송은희, 임시환, 이중석, 유하진) + 곽두원

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);

-- 송은희, 임시환, 이중석, 유하진 등 SALARY 가 0으로 조회되고, 
-- 곽두원이 추가되어 있다

4) DELETE

  • 테이블의 행을 삭제하는 구문
1
2
3
4
5
6
7
8
9
10
11
-- [작성법]
< DELETE FROM `테이블명`
WHERE `조건설정` >
-- 조건을 설정하지 않으면, 테이블의 모든행이 삭제됨

DELETE FROM EMPLOYY
WHERE EMP_NAME = '장채현';
--  EMPLOYEE 테이블에서 장채현 정보 삭제됨

DELETE FROM EMPLOYEE;
-- EMPLOYEE 테이블의 모든 행 삭제

5) TRUNCATE

  • DML이 아닌 DDL 이다.
  • DELETE 보다 수행속도가 더 빠르다.
  • DDL이기 때문에 ROLLBACK을 할 수가 없다
1
2
3
4
-- [작성법]
< TRUNCATE TABLE `테이블명` >
TRUNCATE TABLE EMPLOYEE;
-- ( == DELETE FROM EMPLOYEE;)