Skip to content
난이도 출제 빈출문제은행 6

DML: INSERT·UPDATE·DELETE·트리거 ​

DML(Data Manipulation Language, 데이터 조작어)은 테이블 안의 행을 조회하고, 넣고, 고치고, 지우는 SQL이다. 사용자가 데이터베이스와 주고받는 일은 대부분 DML이다. 시험은 문법 빈칸(INSERT INTO … VALUES, UPDATE … SET, DELETE FROM)과 실행 뒤의 결과 값을 묻는다. 끝에서는 데이터 변경에 자동으로 반응하는 트리거(trigger)도 다룬다.

네 가지 명령 ​

명령어하는 일형식
SELECT행 조회SELECT 열 FROM 테이블
INSERT행 삽입INSERT INTO 테이블(열) VALUES (값)
UPDATE행 값 변경UPDATE 테이블 SET 열=값 WHERE 조건
DELETE행 삭제DELETE FROM 테이블 WHERE 조건

SELECT는 별도 문서에서 다룬다. 예제는 그 문서의 학생 테이블(5행, 점수 합계 380, 정새벽만 학과코드 NULL)을 쓴다.

INSERT ​

INSERT INTO 학생(학번, 이름) VALUES (1006, '윤여름');처럼 열 목록과 값 목록을 같은 순서, 같은 개수로 쓴다. 모든 열에 값을 넣으면 열 목록을 생략할 수 있다. 적지 않은 열은 기본값이나 NULL이 된다.

VALUES 대신 SELECT를 쓰면 다른 조회 결과를 한꺼번에 넣는다. INSERT INTO 우수생(학번, 이름) SELECT 학번, 이름 FROM 학생 WHERE 점수 >= 80;은 85점 김하늘과 90점 박구름의 2행을 넣는다.

UPDATE ​

UPDATE는 WHERE에 맞는 행의 열 값을 SET 뒤의 식으로 바꾼다. 식에는 현재 값을 쓸 수 있다. UPDATE 학생 SET 점수 = 점수 + 5 WHERE 학과코드 = 'EE';는 EE 학생 두 명의 점수를 5씩 올려 합계를 380에서 390으로 만든다. SET 열1 = 값1, 열2 = 값2처럼 여러 열을 한 번에 바꿀 수도 있다.

WHERE를 빠뜨리면 모든 행이 바뀐다. 실제로 조건 없이 학년을 1씩 올리자 5행이 모두 바뀌었다.

DELETE ​

DELETE FROM 학생 WHERE 조건;은 조건에 맞는 행을 지운다. WHERE를 생략하면 모든 행을 지우지만 테이블 구조는 남는다. 구조까지 없애는 것은 DDL(Data Definition Language, 데이터 정의어)의 DROP이다.

NULL이 섞인 조건은 함정이 된다. DELETE FROM 학생 WHERE 학과코드 <> 'CS';는 EE 두 행만 지우고 3행을 남긴다. 학과코드가 NULL인 정새벽은 비교 결과가 참도 거짓도 아닌 '알 수 없음'이 되고, SQL은 참인 행만 고르므로 조건에 걸리지 않기 때문이다.

트리거 ​

트리거는 특정 테이블에 INSERT·UPDATE·DELETE가 일어날 때 자동으로 실행되도록 저장해 둔 SQL이다. 사람이 매번 기억하지 않아도 변경 기록 남기기나 무결성(integrity) 검사를 빠짐없이 할 수 있다.

sql
CREATE TRIGGER 점수변경 AFTER UPDATE OF 점수 ON 학생
BEGIN
  INSERT INTO 로그 VALUES (NEW.학번, OLD.점수 || '->' || NEW.점수);
END;

AFTER는 변경 뒤에, BEFORE는 변경 전에 실행한다는 뜻이다. OLD는 바뀌기 전 행, NEW는 바뀐 뒤 행이다. 김하늘의 점수를 10 내리자 로그에 85->75가 남았다. 트리거 문법은 제품마다 조금씩 다르다.

시험 포인트 ​

  • 행을 다루는 언어 → DML: SELECT, INSERT, UPDATE, DELETE.
  • 짝 키워드: INSERT INTO … VALUES, UPDATE … SET, DELETE FROM.
  • 다른 조회 결과를 넣기 → INSERT INTO … SELECT.
  • WHERE 없는 UPDATE·DELETE → 전체 행 대상.
  • 데이터 변경 이벤트에 자동 실행되는 절차형 SQL → 트리거.

관련 문서