데이터베이스(SQL)

데이터베이스 4일차_조작어(oracle, sql)

롶롶예 2021. 5. 4. 16:13

## DML

- 데이터 조작어
- 생성되어 있는 테이블 자료를 입력, 수정, 삭제
- CRUD : 추가, 조회, 변경, 삭제
- 로그가 남는다 : 작업내용 로그를 기반으로 취소할 수 있다.

ST_DEPT ( DEPT_NO, DEPT_NAME)
ST( S_NO, NAME, BIRTH, DEPT_NO )

CREATE TABLE ST_DEPT (
   DEPT_NO     NUMBER(2)    PRIMARY KEY,
   DEPT_NAME VARCHAR2(50)  NOT NULL
);

CREATE TABLE ST (
   S_NO      CHAR(8)            PRIMARY KEY,
   NAME     VARCHAR2(30)   NOT NULL,
   BIRTH     DATE,
   DEPT_NO NUMBER(2)       REFERENCES ST_DEPT (DEPT_NO ) 
);

## 자료 입력 
-- ST_DEPT 
-- INSERT 
-- 컬럼리스트의 수와 값리스트의 수 일치
-- 컬럼의 데이터타입과 값의 테이터 타입 일치
-- INSERT INTO 테이블명 ( 컬럼명, ....) VALUES (값1, .... ) ; 

INSERT INTO ST_DEPT ( DEPT_NO, DEPT_NAME ) VALUES ( 10, '국문과' ) ;
INSERT INTO ST_DEPT  VALUES ( 20, '영문과' ) ;
INSERT INTO ST_DEPT  VALUES ( 30, '수학과' ) ;
INSERT INTO ST_DEPT  VALUES ( 40, '멀티과' ) ;

INSERT INTO ST (S_NO, NAME, BIRTH, DEPT_NO) 
VALUES ( '20201234', '연문숙','2020-10-10', 10 ) ;

INSERT INTO ST VALUES ( '20201111', '송중기','1900-10-10', 20 ) ; 

학번, 이름, 학과번호 입력
-- 생일 컬럼 생략하고 입력
-- 생략된 컬럼이 NOT NULL 제약조건이 아니면 가능

INSERT INTO ST (S_NO, NAME,  DEPT_NO) 
VALUES ( '20202222', '아이유', 30 ) ;

INSERT INTO ST VALUES ( '20203333', '수지',NULL, 20 ) ; 

## 다른 테이블에서 자료를 읽어서 왕창 입력하는 방법

INSERT INTO ST 
   SELECT EMPLOYEE_ID, LAST_NAME, HIRE_DATE, DEPARTMENT_ID
   FROM  EMP
   WHERE DEPARTMENT_ID IN ( 10,20,30,40 ) ;

================================================

## UPDATE
## row 의 특정 컬럼의 값을 변경

1. 지정한 컬럼에 원하는 값을 지정 => 모든 row 값이 변경 
2. 조건에 맞는 row 에 대해서 지정한 컬럼에 원하는 값을 지정 => 일반적 사용법
3. WHERE 절 조건 컬럼은 유니크 컬럼으로 하는 것이 좋다 

UPDATE ST
SET DEPT_NO = 30 ;
 => 모든 row 값이 변경 

UPDATE ST
SET DEPT_NO = 30 
WHERE NAME ='수지' ;
=> 수지의 부서번호를 30으로 변경 


UPDATE  ST
SET        DEPT_NO = 30  , BIRTH = '2000-10-10'
WHERE   NAME ='수지';
=> 수지의 부서번호를 30으로 변경 

--수지의 학과번호를 송중기와 같게 변경하시오.

UPDATE ST
SET DEPT_NO = ( SELECT DEPT_NO FROM ST WHERE NAME='송중기') 
WHERE NAME ='수지' ;

===================================================

## ROW 삭제
## DELETE 

1. 모든 ROW 삭제
2. 조건에 맞는 ROW만 삭제  => ***

DELETE ST ;
DELETE FROM ST ;
=> 테이블에 INSERT 한 모든 자료가 삭제 !! 주의!!

DELETE ST
WHERE BIRTH < '2005-01-01' ;

==================================================

## DML 작업이 안되는 경우

## INSERT
ST_DEPT 테이블에 INSERT 작업 => OK
ST 테이블에 INSERT  작업 => 항상 되는 것은 아니다.

INSERT INTO ST VALUES ( '20203333', '수지','2000-10-10', 77 ) ;  
=> violated - parent key not found 오류 발생!!

## UPDATE
ST_DEPT 테이블에 UPDATE 작업 => 항상 되는 것은 아니다

UPDATE ST_DEPT
SET DEPT_NO = 35
WHERE DEPT_NAME = '수학과' ;

=> violated - child record found 오류발생 !!
=> 자식테이블 ( ST ) DEPT_NO 컬럼에서 30 없앤다. -> null
     -> ST_DEPT DEPT_NO 30-> 35 수정
     -> ST_DEPT DEPT_NO  NULL -> 35

UPDATE ST
SET DEPT_NO = null
WHERE DEPT_NO = 30 ;

UPDATE ST_DEPT
SET DEPT_NO = 35
WHERE DEPT_NO = 30 ;

UPDATE ST
SET DEPT_NO = 35
WHERE DEPT_NO IS NULL ;

## DELETE
ST_DEPT 테이블에 DELETE 작업 => 항상 되는 것은 아니다

DELETE ST_DEPT
WHERE DEPT_NO=35 ; 

=> constraint (AD40.SYS_C00198137) violated - child record found 오류발생!!