포스트

SQLD: DML, TCL

관리 구문

2과목의 3장인 관리 구문 부분이다.

데이터를 삽입, 삭제, 수정, 생성, 제어하는 SQL판 CRUD라고 생각하면 된다.

DML

DML은 Data Manipulation Language의 약자로, 데이터를 조작하는 언어이다.

테이블에 데이터가 저장되어 있으면, 그 내용을 조작하며 종류로는 INSERT, UPDATE, DELETE, MERGE가 있다.

INSERT

테이블에 새로운 데이터를 튜플 단위로 입력한다.

1
INSERT INTO 테이블명 (COLUMN_LIST) VALUES (COLUMN_LIST 입력할  리스트)

‘테이블의 특정 컬럼에 어떤 값을 INSERT할 것인가’ 라는 형태로 삽입한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
INSERT INTO TB_CUST (
    CUST_ID
    ,CUST_NAME
    ,PASSWD
    ,JOIN_DT
    ,DEL_YN
    ,MONEY
    ,STOP_YN
    ,ACT_POINT
    ,ADDR
) VALUES (
    'HONGKILDONG'
    ,'홍길동'
    ,'hong123'
    ,SYSDATE
    ,'N'
    ,0
    ,'N'
    ,0
    ,'서울 강남구 자곡동'
);

꼭 모든 컬럼에 모든 값을 써야 하는 것은 아니며, 선택을 하고 짝을 맞추어 값을 입력하면 된다.

에러 케이스

  1. 식별자에 NULL을 입력한 경우
  2. NOT NULL인 컬럼에 NULL을 넣은 경우
  3. 자료형에 맞지 않은 입력값을 넣은 경우
  4. 식별자 컬럼에 중복 값을 넣을려는 경우

    INSERT시 입력하지 않은 컬럼은 자동으로 DEFAULT값이 된다 (기본은 NULL).

  5. 컬럼리스트와 입력 값의 개수가 다른 경우

UPDATE

테이블에 있는 기존의 데이터를 변경한다.

1
UPDATE 테이블명 SET 변경할_컬럼 = 바꿀_ WHERE 바꾸고자_하는__조건
1
2
3
4
5
UPDATE TB_CUST
SET CUST_NAME = '이름변경'
    , ACT_POINT = ACT_POINT + 200
    , MONEY = 10000
WHERE CUST_ID = 'C0001';
  1. 변경할 컬럼과 값을 SET뒤에 =로 입력하여 데이터를 수정한다.
  2. 여러 컬럼의 값을 동시에 수정할 수 있다.
  3. WHERE 조건을 사용하지 않으면 테이블 내 모든 행이 변경됨으로 주의한다.

DELETE

테이블에 존재하는 데이터를 튜플 단위로 삭제한다.

1
DELETE FROM 테이블명 WHERE 삭제하고_싶은__조건
1
2
3
DELETE FROM TB_CUST_BADGE
WHERE CUST_ID = 'C0001'
AND BADGE_ID = 'B001';
  1. WHERE 뒤에 삭제할 행의 조건을 입력한다.
  2. ROLLBACK이라는 명령어로 되돌릴 수 있다.

MERGE

기존 내용은 UPDATE하고, 신규 내용은 INSERT한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
MERGE INTO 직원 A
USING 직원_신입 B
ON (A.직원ID = B.직원ID) -- 비교조건

--비교조건이 참일 시 MATCHED
WHEN MATCHED THEN
UPDATE
SET A.직원이름 = B.직원이름
    , A.연봉 = B.연봉

--비교조건이 거짓일 시 
WHEN NOT MATCHED THEN  
INSERT (A.직원ID, A.직원이름, A.연봉)
VALUES (B.직원ID, B.직원이름, B.연봉);

TCL

TCL은 Transaction Control Language의 약자이다.

  • COMMIT
  • ROLLBACK
  • SAVEPOINT
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT BALANCE
FROM ACCOUNT 
WHERE ACC_NO = 'A_ACCOUNT' AND BALANCE >= 1,000,000;

UPDATE ACCOUNT 
SET BALANCE = BALANCE - 1,000,000
WHERE ACC_NO = 'A_ACCOUNT';

UPDATE ACCOUNT 
SET BALANCE = BALANC + 1,000,000
WHERE ACC_NO = 'B_ACCOUNT';

COMMIT; -- 영구반영

COMMIT은 영구 반영한다. (몽고DB에서 SAVE 개념)

트랜잭션 중 하나라도 잘못되면 ROLLBACK이라는 명령어를 사용해야 한다. 즉, 트랜잭션은 원자적이다.

트랜잭션의 특징 4가지:

  • 원자성(Atomicity) : 트랜잭션은 모두 성공하거나 전혀 실행되지 않아야 함 (all or nothing)
  • 일관성(Consistency) : 트랜잭션 실행 전 db내용이 정상이라면, 트랜잭션 후에도 db내용이 정상이어야 함 (예: 트랜잭션 후 중복이 발생하면 안됨)
  • 고립성/격리성(Isolation) : 트랜잭션 실행 도중에 다른 트랜잭션이 영향을 주면 안됨 (경쟁상태가 발생하면 안된다)
  • 지속성 (Durability) : 트랜잭션이 성공적으로 수행되면, 영구적으로 db에 저장되어야 함

ROLLBACK은 마지막 COMMIT 시점까지 롤백된다.

SAVEPOINT

롤백할 세이브 지점을 만들어둔다.

1
2
3
SAVEPOINT SV1; -- 세이브포인트 설정 

ROLLBACK TO SV1; -- SV1까지만 롤백한다  

주의사항

오라클과 SQL서버 차이

오라클에서는 DML은 직접 COMMIT을 해야만 데이터베이스에 영구 반영이 되지만, DDL은 자동으로 COMMIT이 된다.
SQL SERVER는 모두 자동 COMMIT한다.


이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.