본문 바로가기
SQL

[SQL] 데이터를 추가, 수정, 삭제하는 데이터 조작어_1

by lmyourpearl 2025. 12. 1.

DML (Data Manipulation Language)

데이터 조작어라 부르는 명령어는 SELECT문으로 조회한 테이블에 데이터를 추가, 수정, 삭제할 때 사용하는 명령어로 이루어짐.

 

  • 테이블 생성하기
-- DEPT테이블을 복사해서 DEPT_TEMP 테이블 만들기 (백업 목적)
CREATE TABLE DEPT_TEMP
    AS SELECT * FROM DEPT;

-- DEPT_TEMP 테이블 전체 열 조회하기
SELECT * FROM DEPT_TEMP;
  • 테이블 삭제하고 다시 만들기
-- 테이블을 잘못 만들었을 때,
-- 기본 형식
-- DROP TABLE 테이블 이름;

-- 테이블을 삭제하고 
DROP TABLE DEPT_TEMP;
-- 다시 생성
CREATE TABLE DEPT_TEMP
    AS SELECT * FROM DEPT;

테이블에 데이터를 추가하는 INSERT문

특정 테이블에 데이터를 새로 추가할 때 INSERT문을 사용.

INSERT INTO절 뒤에 데이터를 추가할 테이블 이름을 쓰고 해당 테이블의 열을 소괄호로 묶어 지정한 후 VALUES절에는 지정한 열에 입력할 데이터를 작성.

 

-- 기본 형식
INSERT INTO 테이블 이름 [(열1, 열2, ..., 열n)]
VALUES (열1에 들어갈 데이터, 열2에 들어갈 데이터, ... 열n에 들어갈 데이터);


-- DEPT_TEMP 테이블에 데이터 추가하기
INSERT INTO DEPT_TEMP (DEPTNO, DNAME, LOC)
              VALUES (50, 'DATABASE', 'SEOUL');

--확인
SELECT * FROM DEPT_TEMP;
키워드 필수 요소 선택 요소 설명
INSERT INTO 테이블 이름 테이블의 열 새로운 데이터를 입력할 대상 테이블과 열을 지정
VALUES 입력할 데이터   INSERT INTO에서 지정한 테이블의 열 순서와 자료형에 맞는 데이터 입력

** 주의점: INSERT문에 지정한 열 개수와 각 열에 입력할 데이터 개수가 일치하지 않거나 자료형이 맞지 않을 때 또는 열 길이를 초과하는 데이터를 지정했을 때 INSERT문 오류가 발생함.

 

INSERT문에 열 지정을 생략할 때

INSERT문에 지정하는 열은 생략할 수도 있는데, 열 지정을 생략하면 해당 테이블을 만들 때 설정한 열 순서대로 모두 나열되었다고 가정하고 데이터를 작성. 이 또한 테이블을 구성하는 열 개수나 자료형과 길이는 반드시 맞춰야함.

-- INSERT문에 열을 지정하지 않고 데이터 추가하기

INSERT INTO DEPT_TEMP
    VALUES (60, 'NETWORK', 'BUSAN');

--확인
SELECT * FROM DEPT_TEMP;

 

테이블에 NULL데이터 입력하기

INSERT문으로 새로운 데이터를 추가할 때 특정 열에 들어갈 데이터가 확정되지 않았거나 굳이 넣을 필요가 없는 데이터일 때는 NULL을 사용하며, NULL을 INSERT문에 지정하는 방법에는 명시적을 입력하는 방식과 대상 열을 생략하여 암시적으로 NULL이 입력되도록 유도하는 방식이 있음.

-- NULL의 명시적 입력
-- NULL을 지정하여 입력하기
INSERT INTO DEPT_TEMP (DEPTNO, DNAME, LOC)
                VALUES(70   ,'WEB',NULL);
-- 확인
SELECT * FROM DEPT_TEMP;

-- 빈 공백 문자열로 NULL입력하기
INSERT INTO DEPT_TEMP (DEPTNO, DNAME   ,LOC)
                VALUES(80   ,'MOBILE','');
--확인
SELECT * FROM DEPT_TEMP;

** 실무에선 보통 NULL이란 단어를 정확히 입력하는 방식을 선호

-- NULL의 암시적 입력
-- 열 데이터를 넣지 않는 방식으로 NULL 데이터 입력하기
INSERT INTO DEPT_TEMP (DEPTNO, LOC)
                VALUES(90   , 'INCHEON');

-- 확인
SELECT * FROM DEPT_TEMP;
-- 아무것도 기입하지 않으면 NULL

테이블에 날짜 데이터 입력하기

-- EMP 테이블을 복사해서 EMP_TEMP 테이블 만들기

CREATE TABLE EMP_TEMP
    AS SELECT *
        FROM EMP
      WHERE 1 <> 1;
SELECT * FROM EMP_TEMP;
  • WHERE절의 조건이 1<>1 이면, 각 행을 조건식에 대입한 결괏값은 항상 false가 되어 행을 입력하지 않음.
  • 위에 사용한 create 명령어는 EMP 테이블과 열 구조는 같지만 데이터는 복사하고 싶지 않을 때 종종 사용.
-- INSERT문으로 날짜 데이터 입력하기(날짜 사이에 / 입력)

INSERT INTO EMP_TEMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
              VALUES (9999, '홍길동', 'PRESIDENT', NULL, '2001/01/01',
                      5000, 1000, 10);
SELECT * FROM EMP_TEMP;


-- INSERT문으로 날짜 데이터 입력하기(날짜 사이에 - 입력)

INSERT INTO EMP_TEMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
              VALUES (1111, '성춘향', 'MANAGER', 9999, '2001-01-05', 4000,NULL, 20);

SELECT * FROM EMP_TEMP;    


-- TO_DATE 함수를 사용하여 날짜 데이터 입력하기

INSERT INTO EMP_TEMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
                VALUES (2111, '이순신', 'MANAGER', 9999,
                        TO_DATE('07/01/2001', 'DD/MM/YYYY'),
                        4000, NULL, 20);
SELECT * FROM EMP TEMP;

서브쿼리를 사용하여 한 번에 여러 데이터 추가하기

-- 서브쿼리를 사용하여 한 번에 여러 데이터 추가하기 (백업 목적)

INSERT INTO EMP_TEMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
    SELECT E.EMPNO, E.ENAME, E.JOB, E.MGR, E.HIREDATE, E.SAL, E.COMM, E.DEPTNO
      FROM EMP E, SALGRADE S
    WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL
      AND S.GRADE = 1;
SELECT * FROM EMP_TEMP;

** 주의 점

VALUES절은 사용하지 않는다.

데이터를 추가할 테이블과 서브쿼리의 열 개수가 일치해야 한다.

데이터를 추가할 테이블과 서브쿼리의 자료형이 일치해야 한다.

INSERT 대상이 되는 테이블의 열 개수와 자료형만 맞춰 준다면 INSERT문에서 사용하는 서브쿼리는 여러개의 테이블을 조인한 결과일지라도 열 이름에 상관없이 데이터를 추가할 수 있음.


다양한 방식의 INSERT문과 MERGE문

ALL, FIRST와 같은 옵션을 사용하여 한 번에 여러 테이블을 대상으로 데이터를 추가하거나 특정 조건에 따라 다른 테이블에 데이터를 추가하는 등 다양한 방식을 사용할 수 있음.

 

MERGE문

MERGE문을 사용하면 열 구조가 같은 여러 테이블 또는 서브쿼리의 결과 데이터를 한 테이블에 병합하여 추가할 수도 있음.