3 minute read

DML(Data Manipulation Language)

  • 데이터 조작 언어
  • 테이블에 값을 삽입(INSERT), 수정(UPDATE), 삭제(DELETE)

INSERT

  • 테이블에 새로운 행 삽입(추가)

1) 모든 컬럼에 추가

  • 추가하려는 테이블의 컬럼 개수와 컬럼 순서, 데이터 타입 일치 필수
INSERT INTO 테이블명
VALUES (값1, 값2, ..., 값N);

Alt text

기존 ‘CLASS’ 테이블에 새로운 행을 삽입했다.
‘CLASS’ 테이블의 컬럼 개수와 컬럼 순서, 데이터 타입을 지켜 삽입했다.
‘CLASS’ 테이블의 ‘NO’ 컬럼은 PRIMARY KEY가 설정되어 있기 때문에
NULL값을 추가 할 수 없다. (PRIMARY KEY는 자동으로 NOT NULL 제약 조건 추가 됨)


2) 지정한 컬럼에 추가

  • 지정 외 컬럼은 NULL 추가
  • NOT NULL 제약 조건이 있는 컬럼은 반드시 선택하여 값 제시 필수
INSERT INTO 테이블명(컬럼명1, 컬럼명2)
VALUES (값1, 값2);

여기도 추가하려는 컬럼의 개수와 VALUES 값의 개수 일치 시키기. 또 제약 조건에 맞게 데이터를 추가해야한다.


3) SUBQUERY를 이용한 추가

  • SUBQUERY로 조회한 값을 통채로 INSERT
  • SUBQUERY의 결과 값은 INSERT문에 지정한 컬럼 개수와 데이터 동일 필수
INSERT INTO 테이블명 (
    SUBQUERY
);

Alt text

데이터를 추가할 새로운 테이블 ‘CL_DEPARTMENT’를 생성했다.
1) 생성 후
2) 기존에 있던 ‘CLASS’ 테이블의 데이터를 SUBQUERY로 조회한 후
3) INSERT 했다.

여기서도 컬럼 개수 맞춰서 삽입하는 거 잊지 말기.
잊지 말아야할 게 너무 많아….


INSERT ALL

  • 여러 테이블에 새로운 행을 한 번에 삽입
    • SUBQUERY의 조건절 일치 필수
INSERT ALL 
INTO 테이블명1(컬럼, 컬럼, ...) VALUES(값, 값, ...) -- 컬럼 생략 가능
INTO 테이블명2 VALUES(값, 값, ...)
	 SUBQUERY;-- SUBQUERY의 결과값을 테이블1, 테이블2에 각각 추가

Alt text

1) 실습을 위해 데이터를 삽입할 테이블을 생성했다.
2) 하나의 SUBQUERY로 2개의 테이블에 모두 행을 삽입했다.

삽입 하려는 테이블 > 컬럼은
SUBQUERY의 조회 결과에 꼭 포함되어 있어야한다.

-

INSERT ALL
WHEN 조건1 THEN
    INTO 테이블명1(컬럼, 컬럼, ...) VALUES(값, 값, ...)
WHEN 조건2 THEN
    INTO 테이블명1(컬럼, 컬럼, ...) VALUES(값, 값, ...)
SUBQUERY;

이번엔 조건을 이용하여 데이터를 삽입해 볼 것이다.
학년 별로 데이터를 나눠서 삽입하려 한다.

Alt text

우선은 학년 별로 데이터를 저장할 각 테이블을 생성했다.
기존 ‘CLASS’ 테이블의 구조만 복사하여 사용한다.

-

Alt text

WHEN 절을 이용하여
조건에 맞는 학생들을 찾아 알맞은 테이블에 데이터를 삽입한다.

-

Alt text

1학년 > GRADE_1
2학년 > GRADE_2
3학년 > GRADE_3
각 조건에 맞는 테이블에 삽입 되었다.


UPDATE

  • 컬럼 값 수정
  • 전체 행의 개수에는 변화가 없음(값을 수정하기 때문)
  • WHERE 절에 조건 설정하여 원하는 영역만 값 변경
UPDATE 테이블명
SET 변경할 컬럼명 = 변경할 값,
    변경할 컬럼명 = (SUBQUERY),
    ...
WHERE 조건;

Alt text

두 학생들의 정보를 수정하려고 한다.

-

Alt text

WHERE 절을 이용한 이유는
WHERE 절에 조건을 기술하지 않을 경우
전체 행이 수정되기 때문이다.

조건에 값을 변경할 학생의 이름을 기술하고
해당 학생의 ‘MIDDLE_SCORE’ / ‘FINAL_SCORE’를 수정했다.

-

이번에는 SUBQUERY를 이용하여 값을 수정해 볼 것이다.
‘김시래’ 학생의 ‘MIDDLE_SCORE’ / ‘FINAL_SCORE’를 ‘정준수’ 학생의 점수와 동일하게 수정하려 한다.

Alt text

1) ‘정준수’ 학생의 점수를 조회하고 2) 그 SELECT 문을 그대로 SUBQUERY로 사용하여 UPDATE 했다.

-

WHERE 절에 SUBQUERY를 기술하여 사용할 수도 있다.
이번에 실습해 볼 문제는
중간고사/기말고사 평균이 90점 이상인 학생의 이름 뒤에 ‘*’ 기호 추가

Alt text

우선 평균 점수가 90점 이상인 학생의 정보를 조회한다.

-

Alt text

조회했던 SELECT 문을 SUBQEURY로 사용하여
WHERE 절에 기술했다.
위에서 조회한 평균 점수가 90점 이상인 학생들 이름 뒤에
‘*’ 기호가 붙은 것을 확인할 수 있다.


MERGE

  • 두 개의 테이블을 하나의 테이블로 병합
  • 두 테이블의 조건의 결과가 존재할 경우 UPDATE, 없을 경우 INSERT

잘 안 쓴다고 실습 문제도 없었는데
그래도 혼자 해봤다.
맞게 한 건지 잘 모르겠다능…

Alt text

1) CLASS_COPY01 테이블
모든 학생의 정보가 있다.

-

Alt text

2) CLASS_COPY02 테이블 2학년 학생의 정보만 있고, 중간고사 점수가 전부 0점이다.
그리고 01 테이블에는 없는 ‘8학년 장민국’ 학생의 정보를 추가했다.

실습해 볼 것은
첫번째 테이블과 두번째 테이블을 병합하는 건데,
조건을 학번(NO)의 일치 여부로 하고
일치할 경우 첫번째 테이블의 값을 두번째 테이블의 값으로 변경(UPDATE)한다.

일치하는 값이 없을 경우에는 삽입(INSERT)한다.

-

Alt text

좀 길다…
에러 날 때마다 뭐가 문제인지 찾는데 힘들었음…

조건으로 기술했던 학번(NO) 행은 대입에서 제외 시켜야 한다.


DELETE

  • 데이터를 행 단위로 삭제
  • WHERE 절 생략 시 전체 행 삭제
DELETE FROM 테이블명
WHERE 조건식;
  • FOREIGN KEY(외래키) 제약 조건이 설정되어 있는 경우 참조되고 있는 값에 대해서는 삭제 불가
    • 제약 조건 비활성화
-- 제약조건 비활성화
ALTER TABLE 테이블명
DISABLE CONSTRAINTS 제약조건명 CASCADE;

-- 제약조건 활성화
ALTER TABLE 테이블명
ENABLE CONSTRAINTS 제약조건명;

TRUNCATE

  • 테이블 전체 행 삭제 시 사용
    • 모든 데이터는 삭제되지만 테이블의 구조는 남아 있음
  • DELETE 보다 빠른 속도
  • ROLLBACK으로 복구 불가
  • FOREIGN KEY(외래키) 제약 조건이 설정되어 있는 경우 참조되고 있는 값에 대해서는 삭제 불가
    • 제약 조건 비활성화
TRUNCATE TABLE 테이블명;

Categories:

Updated: