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;
'배우기 > 복습노트[oracle sql]' 카테고리의 다른 글
[복습] SQL | Oracle SQL의 분류(DDL, DML, DCL, TCL, DQL) 중 DML의 DELETE (0) | 2023.11.10 |
---|---|
[복습] SQL | Oracle SQL의 분류(DDL, DML, DCL, TCL, DQL) 중 DML의 UPDATE (0) | 2023.11.09 |
[실습문제] 2023. 11. 7.(화) 문제 풀이(3문제) (0) | 2023.11.09 |
[복습] data를 unload 하는 방법 및 데이터 DB화 방법 두 가지 + 복습(20231107) (1) | 2023.11.09 |
[복습] SQL | Oracle SQL의 분류(DDL, DML, DCL, TCL, DQL) 중 DDL의 TRUNCATE (0) | 2023.11.09 |