DML, TCL
부트캠프(END)/Oracle2022. 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 |
댓글()