DML, TCL

부트캠프(END)/Oracle|2022. 6. 28. 16:34

DML(Data Manipulation Language,데이터 조작 언어)

테이블에 있는 데이터를 조작하는 언어이다. 

데이터를 추가하거나, 수정하거나, 삭제할 수 있다.

 

- INSERT~INTO : 데이터 추가

ex) 게시물 생성, 회원 가입, 댓글 달기, 예매, 장바구니 추가 등...

INSERT ALL 의 경우 default가 존재하더라도 입력값을 설정해 주어야 한다.

INSERT INTO table_name VALUES(value1, value2,...)
INSERT INTO table_name(column_name1, column_name2) VALUES(value1, value2..)

- UPDATE~SET : 데이터 수정

ex) 게시물 수정, 회원정보 수정, 댓글 수정, 장바구니 수량 변경 등...

UPDATE table_name SET column_name1=value1, column_name2=value2,...
WHERE ... --지정한 것만 값이 변경되도록

- DELETE~FROM : 데이터 삭제

ex) 회원 탈퇴, 게시물 삭제, 예매 취소 등...

DELETE column_name1, column_name2 FROM table_name
WHERE ... --지정한 것만 삭제되도록

 

DML은 자동으로 저장되지 않기 때문에 COMMIT(저장) 또는 ROLLBACK(취소)가 필요하다.

단, 자바에서 오라클을 다룰 때는 자동으로 Commit 되기 때문에 주의

→ AutoCommit을 해제하는 등의 옵션을 고려해야 한다 + Transaction

 

TCL(Transaction Control Language, 트랜젝션 제어 언어)

COMMIT : 정상 수행, 변경된 내용 저장

ROLLBACK : 비정상 수행, 이전 SQL 문장 취소

 

 

 

INSERT 예제

--employee를 deptno별로 분리해서 저장할 빈 테이블 생성
CREATE TABLE emp_10 AS SELECT empno, ename, job, hiredate, sal FROM emp WHERE 1=2;
CREATE TABLE emp_20 AS SELECT empno, ename, job, hiredate, sal FROM emp WHERE 1=2;
CREATE TABLE emp_30 AS SELECT empno, ename, job, hiredate, sal FROM emp WHERE 1=2;
--deptno가 각 10, 20, 30인 employee들만 각 테이블에 저장
INSERT ALL 
	WHEN deptno = 10 THEN INTO emp_10 VALUES(empno, ename, job, hiredate, sal)
	WHEN deptno = 20 THEN INTO emp_20 VALUES(empno, ename, job, hiredate, sal)
	WHEN deptno = 30 THEN INTO emp_30 VALUES(empno, ename, job, hiredate, sal)
SELECT * FROM emp;
--employee를 hiredate별로 분리해서 저장할 빈 테이블 생성
CREATE TABLE emp_1980 AS SELECT empno, ename, job, hiredate FROM emp WHERE 1=2;
CREATE TABLE emp_1981 AS SELECT empno, ename, job, hiredate FROM emp WHERE 1=2;
CREATE TABLE emp_1982 AS SELECT empno, ename, job, hiredate FROM emp WHERE 1=2;
CREATE TABLE emp_1983 AS SELECT empno, ename, job, hiredate FROM emp WHERE 1=2;
CREATE TABLE emp_1987 AS SELECT empno, ename, job, hiredate FROM emp WHERE 1=2;

--hiredate 연도별로 각 테이블에 저장
INSERT ALL 
	WHEN to_char(hiredate,'rrrr')=1980 THEN
	INTO emp_1980 values(empno, ename, job, hiredate)
	WHEN to_char(hiredate,'rrrr')=1981 THEN
	INTO emp_1981 VALUES(empno, ename, job, hiredate)
	WHEN to_char(hiredate,'rrrr')=1982 THEN
	INTO emp_1982 values(empno, ename, job, hiredate)
	WHEN to_char(hiredate,'rrrr')=1983 THEN
	INTO emp_1983 VALUES(empno, ename, job, hiredate)
	WHEN to_char(hiredate,'rrrr')=1987 THEN
	INTO emp_1985 VALUES(empno, ename, job, hiredate)
SELECT * FROM emp;
--예시 members테이블 생성
CREATE TABLE members(
	id VARCHAR2(20),
	pwd VARCHAR2(10) CONSTRAINT mem_pwd_nn NOT NULL,
	name VARCHAR2(34) CONSTRAINT mem_name_nn NOT NULL,
	sex VARCHAR2(10),
	addr VARCHAR2(300) CONSTRAINT mem_addr_nn NOT NULL,
	tel VARCHAR2(20),
	regdate DATE DEFAULT SYSDATE,
	CONSTRAINT mem_id_pk PRIMARY KEY(id),
	CONSTRAINT mem_sex_ck CHECK(sex IN('남자','여자')),
	CONSTRAINT mem_tel_uk UNIQUE(tel)
)

--이렇게 하면 디폴트값까지 다 주어야 함
INSERT INTO members VALUES('kim','1234','kimdoodoo','여자','서울시 강남구','010-1234-5678',SYSDATE);
INSERT INTO members VALUES('park','1234','parkpoopoo','여자','서울시 중랑구','010-9012-3456','22/06/27');
--이렇게 하면 디폴트나 NULL 허용 값들은 빼고 데이터를 넣을 수 있음(더 많이 씀)
INSERT INTO members(id,pwd,name,sex,addr) VALUES('lee','5678','leedoodoo','남자','서울시 성북구');
--예시 테이블 student 생성
CREATE TABLE student(
	sno NUMBER,
	name VARCHAR2(34) CONSTRAINT std_name_nn NOT NULL,
	CONSTRAINT std_sno_pk PRIMARY KEY(sno))
	
--sequence! 이렇게 하면 생성순서로 각 번호가 부여된다.
INSERT INTO student VALUES((SELECT NVL(MAX(sno)+1,1) FROM student),'kimdoodoo'); 
INSERT INTO student VALUES((SELECT NVL(MAX(sno)+1,1) FROM student),'parkpoopoo');
INSERT INTO student VALUES((SELECT NVL(MAX(sno)+1,1) FROM student),'leelooloo'); 
INSERT INTO student VALUES((SELECT NVL(MAX(sno)+1,1) FROM student),'baebooboo'); 
INSERT INTO student VALUES((SELECT NVL(MAX(sno)+1,1) FROM student),'jeongjoojoo');

COMMIT;

 

UPDATE, DELETE / COMMIT, ROLLBACK 예제

--WHERE절 없이 UPDATE하면 모든 데이터가 다 동일하게 변경된다.
UPDATE student SET name='baebooboo';

ROLLBACK; --COMMIT 전으로 복구됨.

COMMIT; --변경사항이 메모리에 저장됨.

--sno가 1인 학생의 이름만 변경된다.
UPDATE student SET name = 'kimdoodoo' WHERE sno=1;

--sno가 5 이상인 학생 ROW만 삭제된다.
DELETE FROM student WHERE sno>5;
--sno가 짝수인 학생 ROW만 삭제된다.
DELETE FROM student WHERE MOD(sno,2)=0;

'부트캠프(END) > Oracle' 카테고리의 다른 글

JDBC 예제(CURD 게시판)  (0) 2022.06.29
DDL 예제  (0) 2022.06.28
서브쿼리, ROWNUM, 인라인뷰, DDL  (0) 2022.06.27

댓글()