데이터베이스 4일차_조작어(oracle, sql)
## 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 오류발생!!