OracleDataBase06 - DML
DML (Data Management Language)
- 데이터 조작 언어
- 테이블에 레코드를 조작(추가, 수정, 삭제, 조회)하기 위한 명령어들
- INSERT (추가)
- UPDATE(수정)
- DELETE(삭제)
- SELECT(조회 및 선택)
[1] 샘플 테이블 생성
create table exam01(
deptno number(2),
dname varchar2(14),
loc varchar2(14)
);
[2] 레코드 추가
레코드 추가 명령 사용 #1
- insert into 테이블이름( 필드명1, 필드명2, .... ) values(값1, 값2, ...)
insert into exam01(deptno, dname, loc) values(10, 'ACCOUNT', 'NEW YORK');
레코드 추가 명령 사용 #2
- insert into 테이블이름 values (전체 column(필드, 열)에 넣을 값들);
insert into exam01 values(30, 'SALES', 'CHICHAGO');
- 첫번째 방식은 필드명과 입력되어야 하는 값을 1:1 로 매핑하여 입력합니다
널값이 있어도 되는 필드는 필드명, 또는 기본값이 있는 필드명은 필드명과 값을 생략하고 입력가능합니다
- 두번째 방식은 모든 필드에 해당하는 데이터를 모두 입력하는 경우로서 필드명들을 명령어 속에 나열하지 않아도 되지만,
필드의 순서대로 빠짐없이 데이터가 나열되어야 하는 불편함도 있습니다.
- 두가지 방법 모두 null 값을 입력할 수 있습니다
insert into exam01(deptno, dname) values(20, 'MARKETING'); -- 첫번째방법
insert into exam01 values(40, 'OPERATION', null); -- 두번째 방법
[3] 데이터 변경- 수정(UPDATE)
UPDATE 테이블명 SET 변경내용 WHERE 검색 조건
->회원번호가 10인 회원의 나이를 30으로 수정
update memberlist set age=30 where num=10;
-명령문에 WHERE 이후 구문은 생략이 가능합니다.
- 다만 이부분을 생략하면 모든 레코드를 대상으로해서 UPDATE 명령이 실행되어 모든 레코드가 수정됩니다.
- 나이가 29세 이상 -> WHERE AGE>=29
- 논리연산 &&, || -> and or
-> exam01 테이블에서 deptno 값을 모두 30으로 수정
update exam01 set deptno=30;
-> exam01 테이블에서 dname이 'ACCOUNT' 인 레코드의 deptno 를 10으로 수정
update exam01 set deptno=10 where dname='ACCOUNT';
-> emp 테이블의 모든 사원의 sal 값을 10% 씩 인상
update emp set sal = sal * 1.1;
update emp set sal = sal + (sal* 0.1);
-> emp 테이블에서 sal 값이 3000 이상인 사원의 급여 10% 삭감
update emp set sal = sal * 0.9 where sal>=3000;
update emp set sal = sal - (sal*0.1) where sal>=3000;
-> emp 테이블의 hiredate 가 2002년 이전인 사원의 급여를 + 2000
update emp set sal = sal + 2000 where hiredate < '2002-01-01';
update emp set sal = sal + 2000 where hiredate <= '2001-12-31';
-> emp 테이블의 ename 이 j로 시작하는 사원의 job을 manager 로 변경
update emp set job='MANAGER' where ename like 'J%';
update emp set job='MANAGER' where ename like '%J'; -- j로 끝나는 이름 검색
update emp set job='MANAGER' where ename like '%J%' ; -- j를 포함하는 이름 검색
-- 등급이 '18' 인 책은 rentprice 을 10% 인상 , 책 제목에 끝에 18+ 를 추가...
select * from booklist;
update booklist set rentprice=rentprice*1.1, subject = subject || '18+' where grade='18';
-- 오라클의 문자 이어붙이기 연산 : ||
[4]레코드의 삭제
delete from 테이블명 where 조건식
-> rentlist 테이블에서 discount가 100이하이 레코드를 삭제
delete from rentlist where discount<100;
- 수정과 삭제의 제한
'봉제인형 살인사건' 도서가 booklist에 있고, 그 도서를 대여한 적이 있어서 rentlist 에 그 도서의 도서번호가 존재할때,
booklist에서 해당도서를 삭제하거나, 관리상의 목적으로 도서번호를 수정하려고 한다면 Error!!!
봉제인형 살인 사건 도서가 rentlist 에 대여목록으로 존재하므로... 외래키의 참조무결성 에 위배됩니다
따라서 이 삭제 또는 수정 명령은 에러를 발생합니다
delete from booklist where num=3;
update booklist set num=10003 where num=3;
-- integrity constraint (SCOTT.FK1) violated - child record found
-> 해결방법 #1
이를 해결하려면 우선 rentlist 테이블에 해당 도서의 대여목록 레코드를 모두 삭제한 후
booklist 테이블에서 해당 도서를 삭제해야 합니다
delete from rentlist where bnum=3;
delete from booklist where num=3;
해결 방법 #2
외래키 제약조건을 삭제한 후 다시 생성
외래키 제약조건을 다시 생성하는데, 생성시에 옵션을 추가해서 참조되는 값이 삭제되면 참조하는 값도 같이 삭제되게 구성합니다.
-> 외래키 삭제
alter table rentlist drop constraint r_fk1;
-> 새로운 외래키 추가
alter table rentlist add constraint r_fk1 foreign key(bnum)
references booklist(num) on delete cascade;
-- on delete cascade : booklist 의 도서가 삭제되면 rentlist 의 해당 도서 대여내역도 함께 삭제하는 옵션
-> memberlist테이블에서 회원 한명을 삭제하면, rentlist테이블에서도 해당회원이 대여한 기록을 같이 삭제하도록 외래키 설정(외래키 제약조건 삭제 후 재생성)
alter table rentlist drop constraint r_fk2;
alter table rentlist add constraint r_fk2 foreign key(mnum)
references memberlist(num) on delete cascade;