본문 바로가기
데이터 모델과 SQL

[SQL 이해하기] - 17. SQL: DML과 DDL

by 영바이트 2023. 7. 8.

 

앞서 [SQL 이해하기] 포스팅 8 부터 16까지 9개 포스팅에서 데이터베이스에서 데이터를 꺼내는 SELECT 구문에 대해 살펴보았다. 일반적으로 저장되어 있는 데이터를 원하는 목적에 맞게 꺼내는(읽는) 작업이 훨씬 더 자주 일어나기 때문에 SQL을 공부한다고 하면 SELECT 구문을 중심으로 공부하게 된다.

 

이번 포스팅에서는 데이터를 생성하고, 수정하고, 삭제하는 DML(Data Manipulation Language)과 테이블을 생성, 수정, 삭제하는 DDL(Data Description Language)에 대해 정리해보도록 하겠다.

 


 

SELECT 구문이 DML에 포함되는지에 대해서는 원칙이 없는 것으로 알고 있다. 읽는 행위가 데이터를 변경(Manipulation)시키지는 않기 때문이다. DML이라고 하면 아래 4가지 명령을 이야기한다.

 

- INSERT

테이블에 데이터를 생성(삽입)한다.

INSERT INTO 대상 테이블 (컬럼1, 컬럼2, ...) VALUES (값1, 값2, ...);

위 형태의 SQL 쿼리에서 명시되지 않은 컬럼들에는 NULL 값이 입력된다. 따라서 NULL 값이 입력될 수 없도록 제약 조건이 있는 컬럼들에서 오류가 발생할 수 있는 점은 기억하고 있어야한다.

 

대상 테이블의 모든 컬럼들에 값을 삽입한다면 컬럼 지정을 생략할 수도 있다. 다만 입력하려는 값들이 테이블의 컬럼의 수 그리고 순서와 일치해야한다.

INSERT INTO 대상 테이블 VALUES (값1, 값2, ...);

 

- UPDATE

테이블에 저장되어 있는 데이터를 수정한다.

UPDATE 대상 테이블 SET 컬럼1=값1, 컬럼2=값2, ... [WHERE 조건];

대상테이블에 저장되어 있는 값들을 수정한다. WHERE 조건을 붙여주지 않으면 테이블의 모든 행이 수정되기 때문에 주의해야 한다.

 

- DELETE

테이블에 저장되어 있는 데이터를 삭제한다.

DELETE FROM 대상 테이블 [WHERE 조건];

대상 테이블에서 행을 삭제한다. WHERE 조건을 지정하지 않으면 테이블의 모든 행들이 삭제되기 때문에 반드시 주의를 기울여야 한다.

 

DELETE외에 TRUNCATE 명령을 이용해서 테이블에 저장되어 있는 데이터를 삭제할 수도 있다. 하지만 TRUNCATE 명령은 WHERE 조건을 사용할 수 없으므로 행 단위로 데이터를 삭제할 수 없고, Logging을 하지 않아 ROLLBACK이 불가능하므로 데이터베이스 관리 시스템(DBMS)에 주는 부하(load)가 적지만 그 결과가 치명적일 수 있으므로 주의해서 사용해야 한다.

 

- MERGE

테이블에 조건에 맞는 데이터가 있는 경우에는 수정하고, 조건에 맞는 데이터가 없는 경우에는 생성(삽입)한다. 수정과 생성 기능이 합쳐져 있기 때문에 Upsert(Update + Insert)라고 부르기도 한다.

MERGE INTO 대상 테이블 T
USING 참조 테이블 S 또는 SELECT 구문을 이용한 참조 데이터
ON T.COL1=S.COL1 AND T.COL2=S.COL2 ...
WHEN MATCHED THEN
UPDATE 대상 테이블 T SET T.COL1=S.COL1, T.COL2=S.COL2, ... [추가적인 WHERE 조건]
WHEN NOT MATCHED THEN
INSERT INTO 대상 테이블 T (COL1, COL2, ...) VALUES (값1, 값2, ...);

 


 

데이터를 생성, 수정, 삭제하는 명령 외에 데이터를 보관하는 테이블 자체를 생성, 수정, 삭제하는 명령들을 DDL이라고 부른다. DDL로 아래 5가지 명령어를 주로 사용한다.

 

- CREATE

테이블을 생성하는 명령이다.

CREATE TABLE 테이블 이름 (컬럼1 데이터 형태, 컬럼2 데이터 형태, 컬럼3 데이터 형태, ...);

예)
CREATE TABLE STUDENTS (STUDID NUMBER, STUDNAME VARCHAR(10), STUDBIRTHDATE DATE);

 

- DESCRIBE

테이블에 어떤 컬럼들이 있는지 확인하는 명령이다.

DESCRIBE 테이블 이름;

 

- ALTER

테이블에 컬럼을 추가, 수정, 삭제하는 명령이다. 제약 조건 등을 추가, 수정, 삭제하는데도 사용된다. 컬럼 추가, 수정이 기본적인 동작이므로 컬럼을 추가, 수정하는 명령어인 ADD, MODIFY뒤에 COLUMN 키워드가 덧 붙여지지 않는 점을 기억하고 있으면 좋다.

- 컬럼 추가: ADD 키워드 뒤에 COLUMN 키워드가 더해지지 않는다.
ALTER TABLE 테이블 이름 ADD 컬럼이름 데이터 형태;

예) ALTER TABLE STUDENTS ADD STUDZIPCODE VARCHAR(3);

- 컬럼 삭제
ALTER TABLE 테이블 이름 DROP COLUMN 컬럼이름

예) ALTER TABLE STUDENTS DROP COLUMN STUDZIPCODE;

- 컬럼 수정: MODIFY 키워드 뒤에 COLUMN 키워드가 더해지지 않는다.
ALTER TABLE 테이블 이름 MODIFY (컬럼1 데이터 유형, 컬럼2 데이터 유형);

예) ALTER TABLE STUDENTS MODIFY STUDNAME VARCHAR(15) NOT NULL, STUDZIPCODE VARCHAR(5) DEFAULT 00000;

- 컬럼 이름 변경
ALTER TABLE 테이블 이름 RENAME COLUMN 변경할 컬럼 이름 TO 컬럼의 새 이름;

예) ALTER TABLE STUDENTS RENAME COLUMN STUDDEPT TO STUDMAJOR;

- 제약 조건 추가
ALTER TABLE 테이블 이름 ADD CONSTRAINT 제약조건 이름 제약조건 (컬럼이름);

예) ALTER TABLE STUDENTS ADD CONSTRAINT STUD_PK PRIMARY KEY (STUDID);

 

참고로 제약 조건 중 Unique key는 각 행을 구분하는 고유한 값이 입력되지만 Null 값 입력이 가능하고, Primary key는 테이블마다 1개씩만 생성할 수 있고 아예 생성하지 않는 것도 가능하다.

 

- DROP

테이블 자체를 삭제한다. 만약 다른 테이블의 PK를 컬럼의 값으로 갖고 있는 등의 제약 조건이 있다면 CASCADE CONSTRAINT 옵션을 이용해서 제약조건들도 함께 삭제해야 한다.

DROP TABLE 대상 테이블 [CASCADE CONSTRAINT];

 

- TRUNCATE

테이블의 형태만 놔두고 저장된 모든 데이터를 삭제한다. Logging을 하지 않아 Rollback이 되지 않으므로 주의해서 사용해야 한다.

TRUNCATE TABLE 테이블 이름;

 

댓글