SQL - DML
DML(Data Manipulation Language)
- 데이터 조작 언어
- 테이블에 값을 삽입(INSERT), 수정(UPDATE), 삭제(DELETE)
INSERT
- 테이블에 새로운 행 삽입(추가)
1) 모든 컬럼에 추가
- 추가하려는 테이블의 컬럼 개수와 컬럼 순서, 데이터 타입 일치 필수
INSERT INTO 테이블명
VALUES (값1, 값2, ..., 값N);
기존 ‘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
);
데이터를 추가할 새로운 테이블 ‘CL_DEPARTMENT’를 생성했다.
1) 생성 후
2) 기존에 있던 ‘CLASS’ 테이블의 데이터를 SUBQUERY로 조회한 후
3) INSERT 했다.
여기서도 컬럼 개수 맞춰서 삽입하는 거 잊지 말기.
잊지 말아야할 게 너무 많아….
INSERT ALL
- 여러 테이블에 새로운 행을 한 번에 삽입
- SUBQUERY의 조건절 일치 필수
INSERT ALL
INTO 테이블명1(컬럼, 컬럼, ...) VALUES(값, 값, ...) -- 컬럼 생략 가능
INTO 테이블명2 VALUES(값, 값, ...)
SUBQUERY;-- SUBQUERY의 결과값을 테이블1, 테이블2에 각각 추가
1) 실습을 위해 데이터를 삽입할 테이블을 생성했다.
2) 하나의 SUBQUERY로 2개의 테이블에 모두 행을 삽입했다.
삽입 하려는 테이블 > 컬럼은
SUBQUERY의 조회 결과에 꼭 포함되어 있어야한다.
-
INSERT ALL
WHEN 조건1 THEN
INTO 테이블명1(컬럼, 컬럼, ...) VALUES(값, 값, ...)
WHEN 조건2 THEN
INTO 테이블명1(컬럼, 컬럼, ...) VALUES(값, 값, ...)
SUBQUERY;
이번엔 조건을 이용하여 데이터를 삽입해 볼 것이다.
학년 별로 데이터를 나눠서 삽입하려 한다.
우선은 학년 별로 데이터를 저장할 각 테이블을 생성했다.
기존 ‘CLASS’ 테이블의 구조만 복사하여 사용한다.
-
WHEN 절을 이용하여
조건에 맞는 학생들을 찾아 알맞은 테이블에 데이터를 삽입한다.
-
1학년 > GRADE_1
2학년 > GRADE_2
3학년 > GRADE_3
각 조건에 맞는 테이블에 삽입 되었다.
UPDATE
- 컬럼 값 수정
- 전체 행의 개수에는 변화가 없음(값을 수정하기 때문)
- WHERE 절에 조건 설정하여 원하는 영역만 값 변경
UPDATE 테이블명
SET 변경할 컬럼명 = 변경할 값,
변경할 컬럼명 = (SUBQUERY),
...
WHERE 조건;
두 학생들의 정보를 수정하려고 한다.
-
WHERE 절을 이용한 이유는
WHERE 절에 조건을 기술하지 않을 경우
전체 행이 수정되기 때문이다.
조건에 값을 변경할 학생의 이름을 기술하고
해당 학생의 ‘MIDDLE_SCORE’ / ‘FINAL_SCORE’를 수정했다.
-
이번에는 SUBQUERY를 이용하여 값을 수정해 볼 것이다.
‘김시래’ 학생의 ‘MIDDLE_SCORE’ / ‘FINAL_SCORE’를
‘정준수’ 학생의 점수와 동일하게 수정하려 한다.
1) ‘정준수’ 학생의 점수를 조회하고 2) 그 SELECT 문을 그대로 SUBQUERY로 사용하여 UPDATE 했다.
-
WHERE 절에 SUBQUERY를 기술하여 사용할 수도 있다.
이번에 실습해 볼 문제는
중간고사/기말고사 평균이 90점 이상인 학생의 이름 뒤에 ‘*’ 기호 추가
우선 평균 점수가 90점 이상인 학생의 정보를 조회한다.
-
조회했던 SELECT 문을 SUBQEURY로 사용하여
WHERE 절에 기술했다.
위에서 조회한 평균 점수가 90점 이상인 학생들 이름 뒤에
‘*’ 기호가 붙은 것을 확인할 수 있다.
MERGE
- 두 개의 테이블을 하나의 테이블로 병합
- 두 테이블의 조건의 결과가 존재할 경우 UPDATE, 없을 경우 INSERT
잘 안 쓴다고 실습 문제도 없었는데
그래도 혼자 해봤다.
맞게 한 건지 잘 모르겠다능…
1) CLASS_COPY01 테이블
모든 학생의 정보가 있다.
-
2) CLASS_COPY02 테이블
2학년 학생의 정보만 있고, 중간고사 점수가 전부 0점이다.
그리고 01 테이블에는 없는 ‘8학년 장민국’ 학생의 정보를 추가했다.
실습해 볼 것은
첫번째 테이블과 두번째 테이블을 병합하는 건데,
조건을 학번(NO)의 일치 여부로 하고
일치할 경우 첫번째 테이블의 값을 두번째 테이블의 값으로 변경(UPDATE)한다.
일치하는 값이 없을 경우에는 삽입(INSERT)한다.
-
좀 길다…
에러 날 때마다 뭐가 문제인지 찾는데 힘들었음…
조건으로 기술했던 학번(NO) 행은 대입에서 제외 시켜야 한다.
DELETE
- 데이터를 행 단위로 삭제
- WHERE 절 생략 시 전체 행 삭제
DELETE FROM 테이블명
WHERE 조건식;
- FOREIGN KEY(외래키) 제약 조건이 설정되어 있는 경우 참조되고 있는 값에 대해서는 삭제 불가
- 제약 조건 비활성화
-- 제약조건 비활성화
ALTER TABLE 테이블명
DISABLE CONSTRAINTS 제약조건명 CASCADE;
-- 제약조건 활성화
ALTER TABLE 테이블명
ENABLE CONSTRAINTS 제약조건명;
TRUNCATE
- 테이블 전체 행 삭제 시 사용
- 모든 데이터는 삭제되지만 테이블의 구조는 남아 있음
- DELETE 보다 빠른 속도
- ROLLBACK으로 복구 불가
- FOREIGN KEY(외래키) 제약 조건이 설정되어 있는 경우 참조되고 있는 값에 대해서는 삭제 불가
- 제약 조건 비활성화
TRUNCATE TABLE 테이블명;