OracleDataBase기초

OracleDataBase06 - DML

본이qq 2022. 6. 12. 12:25

 

 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;