Cracking Code

SQL - INSERT INTO 본문

Database

SQL - INSERT INTO

CrackCo 2020. 7. 20. 14:15
DB 테이블에 데이터를 입력하기 위한 데이터 조작어 INSERT INTO 에 대해 알아봅시다.

1. 단일 행 입력

INSERT INTO table [(column1, ...)]
VALUES (value1, ...)

INTO 절에 컬럼을 명시하지 않으면 table의 컬럼 순서대로 value 값이 추가됩니다.

컬럼을 명시하고 그 컬럼의 순서에 맞게 입력하면 1:1 대응하여 value 값이 추가됩니다.

입력되는 데이터의 타입은 컬럼의 데이터 타입과 같아야 합니다.

또한 데이터의 크기는 컬럼의 크기보다 작거나 같아야 합니다.

 

DEPT 테이블에 부서 이름이 인사과이며 지역은 서울, 부서 번호는 각각 90 80 70으로 순서를 다르게 추가해봅시다.

INSERT INTO DEPT(DEPTNO, DNAME, LOC)
VALUES(90, '인사과', '서울');

INSERT INTO DEPT(LOC, DNAME, DEPTNO)
VALUES('서울', '인사과', 70);

INSERT INTO DEPT
VALUES(80, '인사과', '서울');

각 데이터가 1:1 매칭되어 부서 테이블에 추가된 것을 확인할 수 있습니다.

만약, NULL 값을 입력하고 싶을 땐 명시적으로 NULL 값 또는 '' 을 VALUES 절에 써주거나

INTO 절에 컬럼을 입력하지 않으면 NULL 처리가 됩니다.

 

2. 다중 행 입력

서브 쿼리를 이용하여 하나의 INSERT 명령문에 여러 행을 동시에 입력할 수 있습니다.

VALUES 절 대신 서브 쿼리를 사용합니다.

 

저는 사원의 번호와 이름을 컬럼으로 가지고 있는 임시 테이블 COPY_EMP를 만들어 진행하였습니다.

-- 임시테이블 생성
CREATE TABLE COPY_EMP
AS
SELECT EMPNO, ENAME FROM EMP
WHERE 1 = 2; -- 테이블의 데이터는 복사하지 않음

테이블의 컬럼명은 복사되고 데이터는 빈 상태인 것을 확인할 수 있습니다.

 

그럼 사원 테이블의 사원들의 번호와 이름을 서브 쿼리로 COPY_EMP에 추가해보겠습니다.

INSERT INTO COPY_EMP(EMPNO, ENAME)
SELECT EMPNO, ENAME FROM EMP;

SELECT * FROM COPY_EMP; -- COPY_EMP 테이블 데이터 확인

사원들의 번호와 이름이 추가된 COPY_EMP 테이블을 확인할 수 있습니다.

 

3. 다중 테이블 다중 행 입력

한 번의 INSERT 명령에 복수 테이블에 데이터를 저장합니다.

3-1. INSERT ALL

INSERT ALL 은 조건의 유무에 따라 문법이 조금 바뀝니다.

 

무조건 INSERT ALL에 대해 먼저 알아봅시다.

INSERT ALL
INTO column1 VALUES(value1, value2, ...)
INTO column2 VALUES(value1, value2, ...)
...
SELECT column1, column2, ...
FROM table;

원하는 컬럼에 원하는 값을 넣을 때 사용합니다.

 

EMP 테이블의 데이터 중 사원 번호, 입사 일, 급여를 SAL_HISTORY 테이블,

사원 번호, 관리자 번호, 급여를 MGR_HISTORY 테이블에 추가해봅시다.

-- SAL_HISTORY 테이블 생성
CREATE TABLE SAL_HISTORY
AS
SELECT EMPNO, HIREDATE, SAL
FROM EMP
WHERE 1 = 2;

-- MGR_HISTORY 테이블 생성
CREATE TABLE MGR_HISTORY
AS
SELECT EMPNO, MGR, SAL
FROM EMP
WHERE 1 = 2;

INSERT ALL
INTO SAL_HISTORY VALUES(EMPNO, HIREDATE, SAL)
INTO MGR_HISTORY VALUES(EMPNO, MGR, SAL)
SELECT EMPNO, HIREDATE, SAL, MGR
FROM EMP;

인출된 행은 17개로 각각 데이터가 잘 삽입되는 것을 볼 수 있습니다.

 

조건 INSERT ALL은 서브 쿼리의 조건이 만족하면 WHEN 절의 명령문을 수행합니다.

INSERT ALL
WHEN 조건절1 THEN
	INTO column1 VALUES(value1, value2, ...)
WHEN 조건절2 THEN
	INTO column2 VALUES(value1, value2, ...)
...
SELECT column1, column2, ...
FROM table;

 

급여가 2500 미만인 사원은 SAL_HISTORY에 사원 번호, 입사 날짜, 급여를

급여가 2500 초과인 사원은 MGR_HISTORY에 사원 번호, 관리자 번호, 급여를

사원 테이블에서 선택해 값을 추가해봅시다.

INSERT ALL
WHEN SAL < 2500 THEN
	INTO SAL_HISTORY VALUES(EMPNO, HIREDATE, SAL)
WHEN SAL > 2500 THEN
	INTO MGR_HISTORY VALUES(EMPNO, MGR, SAL)
SELECT EMPNO, HIREDATE, MGR, SAL
FROM EMP;

3-2. INSERT FIRST

INSERT FIRST
WHEN 조건절1 THEN
	INTO column VALUES(value1, value2, ...)
WHEN 조건절2 THEN
	INTO column VALUES(value1, value2, ...)
...
ELSE
	INTO column VALUES(value1, value2, ...)
SELECT column1, column2, ...
FROM table;

INSERT ALL 절에 ELSE 절이 추가된 형태입니다.

 

급여가 800인 사원은 SAL_HISTORY에 사원 번호, 입사 날짜, 급여를

급여가 2500 초과인 사원은 MGR_HISTORY에 사원 번호, 관리자 번호, 급여를

사원 테이블에서 선택해 값을 추가해봅시다.

INSERT FIRST
WHEN SAL = 800 THEN
	INTO SAL_HISTORY VALUES(EMPNO, HIREDATE, SAL)
WHEN SAL < 2500 THEN
	INTO MGR_HISTORY VALUES(EMPNO, MGR, SAL)
ELSE
	INTO TEST_HISTORY VALUES(EMPNO, SAL)
SELECT EMPNO, HIREDATE, SAL, MGR
FROM EMP;

'Database' 카테고리의 다른 글

SQL - DELETE  (0) 2020.07.20
SQL - UPDATE  (0) 2020.07.20
SQL - SUB QUERY  (0) 2020.07.19
SQL - JOIN (ANSI)  (0) 2020.07.19
SQL - JOIN (ORACLE)  (0) 2020.07.19
Comments