본문 바로가기

배우기/복습노트[oracle sql]

[복습] SQL | Oracle SQL의 분류(DDL, DML, DCL, TCL, DQL) 중 DML의 INSERT

728x90
반응형

2. DML(Data Manipulation Language): INSERT, UPDATE, DELETE, MERGE

DML은 데이터 수정 언어이다.

먼저 INSERT부터 살펴보자.

 

1) INSERT: 데이터(행 단위) 삽입 언어

단건 삽입만 가능(한 건씩만)하며 서브쿼리 사용시에는 여러 건 삽입이 가능하다.

문법

INSERT INTO table_name VALUES(값1, 값2, ...);   전체 컬럼의 값을 입력한다

INSERT INTO table_name(컬럼1, 컬럼2, ...) VALUES(값1, 값2, ....); 선택한 컬럼만 데이터를 입력한다.

 

여기서 ITAS 문법을 살펴보면, 테이블의 조회 결과를 동시에 입력하고자 할 때 예를들면

A테이블 (c1, c2 ,c3)

B테이블(c1, c2, c4, c3)

insert into A

select c1, c2, c3 from B;

하면 된다.

 

다른 예를 보면

A테이블(c1, c2, c3, c4, c5) 
B테이블(c1, c2, c4, c3)

insert into A(c1, c2, c4, c3)
select * from B;

이렇게 둘 중 하나의 방법으로 맞춰도 가능하다.

 

ITAS 테이블시 주의할 점은 insert 테이블 컬럼 목록과 select테이블 컬럼 목록이 일치해야 한다는 것이다.

 

 

연습문제를 하나 풀어보자.

현업에서 이런 요청이 올 수 있다.

emp_test1을 만들고 emp_test1에 새로운 컬럼을 추가 요청. hobby 컬럼(nullable)을 hiredate뒤에 배치 요청(중간에 배치)

step 0) emp테이블로 emp_test1 생성

create table emp_test1 as select * from emp;

 

step 1) CTAS로 테이블 복제(데이터와 함께)

create table emp_test1_231108 as select * from emp_test1;

 

step 2) 기존 테이블 삭제

drop table emp_test1;

 

step 3) 새로운 테이블 요구사항에 맞게 생성

※ 참고: orange에서 테이블 생성 스크립트 추출하기

step 1의 테이블명에 커서를 이동시킨 후 F4 누르면 DESC탭이 열린다.

그 안에 테이블 생성 스크립트가 존재함. 그 스크립트를 복사해오면 된다.

 

CREATE TABLE EMP_TEST1
(
    EMPNO       NUMBER(4),
    ENAME       VARCHAR2(10),
    JOB         VARCHAR2(9),
    MGR         NUMBER(4),
    HIREDATE    DATE,
    HOBBY       VARCHAR2(30),           -- 추가
    SAL         NUMBER(7,2),
    COMM        NUMBER(7,2),
    DEPTNO      NUMBER(2)
);

 

step 4) 데이터 이동(복제, 새 테이블로)

--sol1) select문의 테이블 레이아웃 기준으로 작성
insert into emp_test1(empno, ename, job, mgr, hiredate, sal, comm, deptno)
select * from emp_test1_231108;

--sol2) insert문의 테이블 레이아웃 기준으로 작성
insert into emp_test1
select empno, ename, job, mgr, hiredate, null, sal, comm, deptno from emp_test1_231108;

 

양 테이블의 컬럼 수가 일치하지 않을 때 컬럼 수가 적은 쪽에 null을 사용하여 컬럼 수가 많은 쪽에 맞게 작성하면 된다.

(insert select문(ITAS문), 집합 연산자에서 주로 사용)

 

아래는 여러 테스트를 해본 내용이다.

 

 

student_t10 테이블을 student와 구조는 같게(데이터 없이) 생성 후 한 학생의 정보를 입력하여라.

insert into student_t10(studno, name, grade) values(1, 'a', 1); 

위와 같이 하면 에러가 난다(null을 ~안에 삽입할 수 없습니다.)

즉 not null 선언된 컬럼은 반드시 입력시에 명시가 필요하다.
desc student_t10 보면 not null인 부분이 있는데,  적어도 
insert into student_t10(studno, name, id, jumin) values(1, 'a', 'aa',  '9999999999999');
이정도는 해야 함(studno는 필수 아님)
commit;

 

728x90
반응형