edu day 6
: 앞서 배운 SELECT문은 테이블에 저장된 테이터를 검색할 때 사용되는 SLQ문으로 일반적으로 쿼리(QUERY)문 이라고 부른다. DML(Data Manipulation Language)은 데이터베이스의 테이블에 새로운 데이터를 저장(INSERT) 하거나 삭제(DELETE) 또는 수정(UPDATE) 및 병합(MERGE)할 때 사용하는 데이터 조작어를 의미한다.

.
EMP - 사원번호: 기본키 / 부서번호: 참조키
1. 중복 불가
2. NULL 불가(NOT NULL)
1. 참조되는 테이블의 컬럼데이터만 사용 가능
1. 커밋, 롤백을 할 논리 단위 (작업단위)
2. DML(추가, 수정, 삭제, 병합)이 실행되는 순간 트랜잭션(TX)이 만들어진다.
3. commit(반영), rollback(취소) 명령으로 TX종료
: INSERT 문은 테이블에 데이터를 저장하기 위한 데이터 조작어이다. 한 번에 하나의 행을 테이블에 저장하는 단일 행 INSERT 방법과 서브쿼리를 이용하여 한꺼번에 여러 행을 동시에 저장하는 다중 행 INSERT 방법이 있다.
NSERT INTO 테이블명 [(컬럼명,컬럼명2,...)]
VALUES ( 값, 값2, ... );
INSERT INTO DEPT(DEPTNO, DNAME, LOC) VALUES (50, '개발', '서울'); --TX가 시작
INSERT INTO DEPT(DEPTNO, DNAME, LOC) VALUES (60, '개발', '서울');
INSERT INTO DEPT(DEPTNO, DNAME, LOC) VALUES (70, '개발', '서울');
COMMIT; -- 반영 후 TX종료
50번 추가 --TX시작
10번 수정
20부서 삭제
ROLLBACK; --TX종료
INSERT INTO dept
VALUES ( 60 ,'인사‘,’경기‘);
INSERT INTO DEPT VALUES(60, '인사', '경기');
INSERT INTO DEPT(deptno,dname) VALUES(70,'인사');
INSERT INTO DEPT(deptno,dname,loc) VALUES(80, '인사', NULL);
INSERT INTO DEPT(deptno,dname,loc) VALUES(81, '인사', '');
-- 이는 널이 아닌 공백 값이다.
INSERT INTO DEPT(deptno,dname,loc) VALUES(82, '인사', ' '); -- 널이 아닌 공백
INSERT INTO EMP VALUES(9000,USER, '연구원',7839,SYSDATE, 5000,NULL,90);
--> USER는 SCOTT계정 이름이, SYSDATE는 현재 날짜가 적용된다.
INSERT INTO EMP VALUES (9001,'홍길동','MANAGER',7839,'2000/01/01',2000,NULL,30);
COMMIT;
INSERT INTO EMP VALUES (9002,'임꺽정','MANAGER',7839,TO_DATE('1999-12-13','YYYY/MM/DD'),2000,NULL,30);
COMMIT;
INSERT INTO DEPT(DEPTNO, DNAME, LOC) VALUES (11, '인사');
INSERT INTO DEPT VALUES(12, '인사');
INSERT INTO DEPT(DEPTNO, DNAME, LOC) VALUES ('개발', 13, '인사');
INSERT INTO DEPT(DEPTNO, DNAME, LOC) VALUES('개발', 14, 인사);
: VALUES 절을 사용하는 대신에 Subquery를 이용하여 하나의 INSERT문을 사용하여 한꺼번에 여러 행을 생성할 수 있다. 즉 기존의 테이블에 저장된 데이터를 서브쿼리를 이용하여 복사한 후에 INSERT문으로 새로운 행을 생성하는 것이다.
주의할 점은 INTO절에서 지정한 컬럼의 개수와 데이터 타입이 서브쿼리를 수행한 결과와 반드시 동일해야 된다.
INSERT INTO 테이블명 [(컬럼명,컬럼명2,...)]
Subquery
CREATE TABLE MYDEPT AS SELECT * FROM DEPT WHERE 1=2;
-- 구조만 복사, 데이터 없음, 기본키 조건 또한 초기화
INSERT INTO MYDEPT SELECT * FROM DEPT;
--'n개의 행이 삽입되었습니다.' 출력되면 성공
: 한 번의 INSERT시 여러 테이블에 복수 데이터를 저장하는 방법을 INSERT ALL이라고 부른다.
INSERT ALL
[WHEN 조건식 THEN]
INTO 테이블1 VALUES ( 컬럼명,컬럼명2,...,컬럼명n)
[WHEN 조건식2 THEN]
INTO 테이블2 VALUES ( 컬럼명,컬럼명2,...,컬럼명n)
Subquery;
CREATE TABLE MYEMP_HIRE AS SELECT EMPNO, ENAME, HIREDATE, SAL FROM EMP WHERE 1=2;
--MYEMP_HIRE TABLE 생성
CREATE TABLE MYEMP_MGR AS SELECT EMPNO, ENAME, MGR FROM EMP WHERE 1=2;
--MYEMP_MGR TABLE 생성
INSERT ALL
INTO MYEMP_HIRE VALUES (EMPNO,ENAME,HIREDATE,SAL)
INTO MYEMP_MGR VALUES (EMPNO, ENAME, MGR)
SELECT EMPNO, ENAME, HIREDATE, SAL, MGR
FROM EMP;
무조건 INSERT ALL문 구조
INSERT ALL
INTO (TABLE 1) VALUES (col1, col2, ...)
INTO (TABLE 2) VALUES (col1, col2, ...)
Subquery;
조건이 있을 때
--테이블 생성
CREATE TABLE MYEMP_HIRE2 AS SELECT EMPNO, ENAME, HIREDATE, SAL FROM EMP WHERE 1=2;
CREATE TABLE MYEMP_MGR2 AS SELECT EMPNO, ENAME, MGR FROM EMP WHERE 1=2;
--조건 INSERT ALL
INSERT ALL
WHEN SAL > 3000 THEN INTO MYEMP_HIRE2 VALUES (EMPNO,ENAME,HIREDATE,SAL)
WHEN MGR = 7698 THEN INTO MYEMP_MGR2 VALUES (EMPNO,ENAME,MGR)
SELECT EMPNO, ENAME, HIREDATE,SAL,MGR
FROM EMP;
: 테이블에 저장된 데이터를 수정
UPDATE 테이블명
SET 컬럼명=변경할값[, 컬럼명1=변경할값][WHERE 조건식];
UPDATE MYDEPT SET loc = '서울', dname = '영업' WHERE DEPTNO = 50;
UPDATE MYDEPT SET DNAME = (SELECT DNAME FROM MYDEPT WHERE DEPTNO=10), LOC = (SELECT LOC FROM MYDEPT WHERE DEPTNO = 20) WHERE DEPTNO = 60;
DELETE FROM 테이블명
[WHERE 조건식];
DELETE FROM MYDEPT WHERE DEPTNO =50;
DELETE FROM MYDEPT WHERE LOC = (SELECT LOC FROM MYDEPT WHERE DEPTNO = 20);
UPDATE TB_DEPARTMENT SET capacity = ROUND(CAPACITY * 1.1);
UPDATE TB_STUDENT SET student_address = '서울시 종로구 숭인동 181-21' WHERE student_no = 'A413042';
SELECT * FROM TB_STUDENT WHERE STUDENT_NO = 'A413042';
UPDATE TB_STUDENT SET student_ssn = SUBSTR(STUDENT_SSN,1,6);
DELETE FROM TB_GRADE WHERE STUDENT_NO IN (SELECT STUDENT_NO FROM TB_STUDENT WHERE absence_yn = 'Y');
UPDATE TB_GRADE SET POINT = 3.5 WHERE (STUDENT_NO,CLASS_NO) IN (SELECT STUDENT_NO, TB_GRADE.CLASS_NO FROM TB_STUDENT JOIN TB_GRADE USING(STUDENT_NO) JOIN TB_DEPARTMENT USING(DEPARTMENT_NO) JOIN TB_CLASS ON TB_CLASS.CLASS_NO = TB_GRADE.CLASS_NO WHERE STUDENT_NAME = '김명훈' AND DEPARTMENT_NAME = '의학과' AND CLASS_NAME = '피부생리학' AND TERM_NO = 200501);
SELECT STUDENT_NAME, TB_CLASS.CLASS_NAME, POINT FROM TB_STUDENT JOIN TB_GRADE USING(STUDENT_NO) JOIN TB_DEPARTMENT USING(DEPARTMENT_NO) JOIN TB_CLASS ON TB_CLASS.CLASS_NO = TB_GRADE.CLASS_NO WHERE STUDENT_NAME = '김명훈' AND DEPARTMENT_NAME = '의학과' AND CLASS_NAME = '피부생리학';
SELECT * FROM MYDEPT; --바로 접근 불가능
SELECT * FROM SCOTT.MYDEPT; -- MYDEPT TABLE을 보유하는 SCOTT를 참조하여 접근 가능
1) 트랜잭션내의 모든 데이터 변경 사항은 트랜잭션이 종료되기 전까지는 모두 임시적 이다. 따라서 데이터를 변경 전 상태로 복구 할 수 있다.
2) 변경된 행은 내부적으로 잠금(Lock)이 걸리게 되어 해당 사용자를 제외한 나머지 사용자는 해당 행들을 변경할 수 없다. 트랜잭션을 COMMIT 또는 ROLLBACK으로 종료시켜야 잠금(Lock)이 해제된다.

--> DML문을 사용한 경우 에는 반드시 COMMIT이나 ROLLBACK으로 트랜잭션을 종료시켜야 다른 사용자가 무한 대기하는 상황을 피할 수 있다
: 데이터베이스의 구조를 생성하거나 수정 및 삭제하는데 사용되는 SQL문이다. 자동으로 COMMIT되기 때문에 데이터베이스에 즉각 영향을 미치며 데이터베이스 사전(DATA DICTIONARY)에 정보가 저장된다.


CREATE TABLE [스키마].테이블명
( 컬럼명 데이터타입 [DEFAULT 값 | 제약조건][,...] );
스키마 : 계정
SELECT deptno,dname,loc
FROM SCOTT.dept;
일반적으로 자기 스키마일 때는 생략 가능. 다른 스키마의 객체를 접근하기 위해서는 '스키마.객체'형식으로 한다.
테이블 및 컬럼명은 문자로 시작하고 길이는 30문자 이내로 작성한다.
테이블 및 컬럼명은 A~Z, a~z, 0~9, _, $, #를 사용할 수 있고 한글 사용도 가능하지만 권장하지 않는다.
동일한 스키마 내에서는 다른 객체와 이름이 중복되면 식별이 안되기 때문에 중복되지 않도록 이름을 지정해야 된다. 하지만 스키마가 다른 경우에는 스키마를 통하여 식별이 가능하기 때문에 객체 이름의 중복이 가능하다.
오라클 데이터베이스가 예약어로 사용하는 이름은 사용이 불가능하며 대소문자는 구별하지 않는다.
소문자로 테이블 명을 설정해도 데이터 사전(Data Dictionary)에는 자동으로 대문자로 저장이 된다. 따라서 테이블 명을 검색할 경우에는 반드시 대문자로 지정해야 된다.
CHAR(size) : 고정 길이의 문자 데이터 저장.
1바이트 ~ 2000바이트
VARCHAR2(size) : 가변 길이의 문자 데이터 저장.
1바이트 ~ 4000 바이트
-> 대부분 VARCHAR2 사용
컬럼 레벨 제약조건 : 한 개의 컬럼에 한 개의 제약조건만 정의가 가능하고 위의 5가지 모든 제약조건에 대해서 사용이 가능하다. (단점: 컬럼 하나당 하나의 제약조건밖에 못쓴다.)
테이블 레벨 제약조건 : 테이블의 컬럼 정의와 분리하여 정의한다. 한 개 이상의 컬럼에 한 개의 제약조건을 정의할 수 있으며 NOT NULL제약조건을 제외한 나머지 4개의 제약조건에 사용이 가능하다.(하나의 컬럼에 여러 개의 제약조건 부여 가능)