본문 바로가기
sql/oracle

INSERT

by choi-dev 2024. 8. 11.

지금까지 학습했던 것은 DML의 SELECT문이었다. SELECT는 조회를 할 때 사용하는 것이었는데 이제 남은 DML인 INSERT, UPDATE, DELETE에 대해 학습을 하겠다. 첫번째는 INSERT부터 정리한다.

 

INSERT

CREATE TABLE DEPT_TEMP AS SELECT * FROM DEPT

일단 DDL CREATE를 사용해 테이블을 생성한다. DEPT 테이블을 복사해 만들겠다.

 

DROP TABLE DEPT_TEMP

행여나 테이블을 잘못 복사했다면 DROP을 사용한다. 테이블을 생성했으면 로우 데이터를 하나 삽입해보자. INSERT의 사용법은 생각보다 간단하다.

 

INSERT INTO 테이블 (컬럼1, 컬럼2, ...) VALUES ('데이터1', '데이터2', ...)

위와 같은 형태로 값을 넣어주면 된다. DEPT 테이블을 복사한 DEPT_TEMP 테이블에 직접 로우 데이터를 추가해보겠다.

 

현재 테이블의 프로퍼티들은 다음과 같다. 예제 테이블에서는 primary key 값이 존재하지 않는 형태이므로 DEPTNO 값도 직접 입력해주어야 한다.

 

INSERT INTO DEPT_TEMP dt (DEPTNO, DNAME, LOC) VALUES (50, 'DATABASE', 'SEOUL');

다음과 같이 입력해본다.

 

조회를 해보았을 때, 입력된 것을 확인할 수 있다. 만일 에러가 난다면, 지정한 열 개수와 입력할 데이터의 개수가 일치하지 않게 되면 에러가 발생하기에 본인이 해당 컬럼에 대해 맞게 데이터를 넣는지 확인해보자.

 

현재는 단순한 데이터만 삽입했는데 날짜 데이터를 넣어야 하는 경우가 생긴다면 몇 가지 방법을 사용할 수 있다. 이번에는 EMP 테이블을 복사해서 TEMP 테이블을 생성해보자.

 

CREATE TABLE EMP_TEMP AS SELECT * FROM EMP WHERE 1 <> 1;

다만 이번에는 열에 대한 구조만 복사하고 데이터는 복사하지 않기 위해서 WHERE.1 <> 1이라는 무조건 거짓인 로직을 추가했다. 약간 억지스럽긴 하지만 스키마는 복사하고 데이터는 안가져오는 방법 중 나름 유용하게 사용할 수 있다.

 

INSERT INTO EMP_TEMP et (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) VALUES (9999, '최승대', 'PRESIDENT', NULL, '2001/01/01', 5000, 1000, 10)

이제 다음과 같이 데이터를 삽입해보자. 현재는 '2001/01/01' 데이터를 직접 삽입했다. 물론 이렇게 하는 방법은 프레임워크 단에서 현재 시간을 불러올 수 있는 라이브러리나 자체적으로 제공해주는 함수들이 존재하기에 상관은 없지만 데이터베이스에서도 이를 처리할 수 있다. 이를 테면 나는 mysql에서 CURRENT_TIMESTAMP 함수를 자주 사용하고 있다.

 

INSERT INTO EMP_TEMP et (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) VALUES (9998, '권민혁', 'SLAVE', NULL, SYSDATE, 5000, 1000, 10)

오라클에서는 SYSDATE라는 함수를 사용한다.

 

조회해보면 이렇게 값을 얻을 수 있다. 참고로 연/월/일 표기가 아닌 월/일/년으로 표기하게 되면 위의 INSERT 문을 에러가 발생한다. TO_DATE 함수를 사용해 처리할 수 있다.

 

이번엔 서브쿼리를 사용해 여러 개의 데이터를 넣어보겠다. EMP_TEMP 테이블에 SALGRADE가 1인 사원들의 정보를 넣어본다고 가정한다.

 

SELECT
    e.EMPNO,
    e.ENAME,
    e.JOB,
    e.MGR,
    e.HIREDATE,
    e.SAL,
    e.COMM,
    e.DEPTNO
FROM
    EMP e
JOIN SALGRADE s ON
    e.SAL BETWEEN s.LOSAL AND s.HISAL
WHERE
    s.GRADE = 1

일단 서브쿼리는 다음과 같이 구성할 수 있다. 이제 이 조회된 데이터를 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
JOIN SALGRADE s ON
    e.SAL BETWEEN s.LOSAL AND s.HISAL
WHERE
    s.GRADE = 1

서브쿼리를 활용한 여러 데이터 삽입의 경우, VALUES 절은 사용하지 않고 추가하는 컬럼의 개수와 서브쿼리의 열의 개수가 같아야 한다는 점을 기억한다.

 

 

'sql > oracle' 카테고리의 다른 글

DELETE  (0) 2024.08.11
UPDATE  (0) 2024.08.11
서브쿼리  (0) 2024.07.31
JOIN  (0) 2024.06.02
GROUP BY 함수  (0) 2024.05.06