◈ 테이블의 행에 대한 삽입,변경,삭제 기능을 제공하는 SQL 명령
◈ DML 명령 실행 후 COMMIT 명령(DML 명령의 적용) 또는 ROLLBACK명령(DML 명령의 취소)을 실행하는 것을 권장
형식) INSERT INTO 테이블명 VALUES(컬럼값,컬럼값,...)
◈ 테이블에 삽입될 행의 컬럼값은 테이블 속성에 맞게 차례대로 나열하여 전달되도록 작성
◈ 테이블의 속성 순선대로 자료형에 맞는 컬럼값을 생략없이 차례대로 전달하여 삽입
◈ 테이블 속성(컬럼과 자료형) 확인
형식) DESC 테이블명DESC DEPT;
◈ DEPT 테이블에 새로운 행(부서정보) 삽입
INSERT INTO DEPT VALUES(50,'회계부','서울시');
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM DEPT;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
───────────────────────────────────────
◈ 삽입행으로 전달될 컬럼값의 갯수가 테이블의 컬럼 갯수와 맞지 않을 경우 에러 발생INSERT INTO DEPT VALUES(60,'총무부');
※ 에러 발생 : 전달값이 충분하지 않아 에러 발생
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO DEPT VALUES(60,'총무부','인천시','031-1234-5678');
※ 에러 발생 : 전달값이 너무 많아 에러 발생
───────────────────────────────────────
◈ 삽입행으로 전달될 컬럼값이 테이블의 컬럼 자료형과 맞지 않거나 자료형의 크기보다 큰 경우 에러 발생INSERT INTO DEPT VALUES('육십','총무부','인천시');
※ 에러 발생 : 컬럼의 자료형과 맞지 않은 값을 전달하여 에러 발생
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO DEPT VALUES(60,'총무부','인천시 월미구');
※ 에러 발생 : 컬럼 자료형의 크기보다 큰 값을 전달하여 에러 발생
◈ 테이블의 컬럼에 부여된 제약조건을 위반하는 값이 전달될 경우 에러 발생
◈ PK(PRIMARY KEY) 제약조건 : 테이블에 저장된 기존행의 컬럼값과 중복된 값이 저장되도록 설정하는 제약조건
◈ DEPT 테이블의 DEPTNI 컬럼에 PK 제약조건 설정SELECT * FROM DEPT;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT DISTINCT DEPTNO FROM DEPT;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO DEPT VALUES(50,'총무부','인천시');
※ 에러 발생 : PK 제약조건을 위반한 값을 전달하여 에러 발생
───────────────────────────────────────
◈ PK 제약조건이 부여된 컬럼에는 NOT NULL 제약조건이 자동으로 설정되어 NULL 저장 불가능INSERT INTO DEPT VALUES(NULL,'총무부','인천시');
※ 에러 발생
◈ 테이블의 속성과 컬럼의 제약조건을 위반하지 않는 값을 전달해야만 행 삽입 가능
→ 데이터 무결성 유지
◈ 데이터 무경성 : 테이블에 잘못된 값이 저장되지 않도록 하여 정상적인 결과가 검색INSERT INTO DEPT VALUES(60,'총무부','인천시');
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM DEPT;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
◈ 테이블에 행 삽입시 컬럼에 값을 저장하고 싶지 않은 경우 NULL 전달하여 삽입 처리
INSERT INTO DEPT VALUES(70,'영업부',NULL);
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM DEPT;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
※ 명시적 NULL 사용
◈ 테이블의 컬럼이 생략되면 생략된 컬럼에는 컬럼의 기본값이 자동으로 전달되어 삽입 처리
◈ 테이블 생성 또는 테이블 구조 변경시 컬럼 기본값(COLUMN DEFAULT VALUE) 설정 가능
◈ 컬럼 기본값을 미설정시 NULL을 기본값으로 자동 설정INSERT INTO DEPT(DEPTNO,DNAME) VALUES(90,'인사부');
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
◈ LOC 컬럼 생략 : NULL 전달되어 삽입 - 묵시적 NULL 사용SELECT * FROM DEPT;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
◈ 날짜형 컬럼에는 날짜값 대신 SYSDATE 키워드를 사용하여 값을 전하여 삽입 처리
DESC EMP;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO EMP VALUES(9000,'KIM','MANAGER','7298','00/12/10',3500,1000,40);
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM EMP;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO EMP VALUES(9001,'LEE','ANALYST','9000',SYSDATE,2000,NULL,40);
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM EMP;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
◈ INSERT 명령에 서브쿼리(SUBQUERY)를 사용하여 행 삽입 가능
형식) INSERT INTO 테이블명 SELECT 검색대상,... FROM 테이블명 [WHERE 조건식]
◈ 서브쿼리의 검색결과를 이용하여 테이블에 행 삽입 - 다른 테이블의 행을 검색하여
현재 테이블에 행 삽입 : 테이블 행 복사
◈ 행이 삽입될 테이블의 속성과 서브쿼리의 검색대상에 대한 속성(컬럼명을 제외한 검색대상의 갯수,자료형,크기)이 동일
◈ BONUS 테이블의 속성 확인 및 행 검색
DESC BONUS;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM BONUS;
▦ EMP 테이블에서 성과급이 존재하는 사원을 검색하여 BONUS 테이블에 삽이 처리
INSERT INTO BONUS SELECT ENAME,JOB,SAL,COMM FROM EMP WHERE COMM IS NOT NULL;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM BONUS;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
형식) UPDATE 테이블명 SET 컬럼명=변경값,컬럼명=변경값,... [WHERE 조건식]
◈ WHERE의 조건식이 참인 행만 검색하여 컬럼값 변경
◈ WHERE 생략된 경우 테이블의 저장된 모든 행의 컬럼값을 동일하게 변경
◈ WHERE에서 사용되는 조건식의 컬럼은 PK 제약조건이 부여된 컬럼을 사용하는 것을 권장
→ 단일행을 검색하여 컬럼값 변경
◈ 데이터 무결성을 위반한 수 있으므로 PK 제약조건이 부여된 컬럼값은 변경하지 않는 것을 권장
▦ DEPT 테이블에서 부서번호가 50인 부서정보 검색
SELECT * FROM DEPT WHERE DEPTNO=50;
※ 부서이름 : 회계부, 부서위치 : 서울시
▦ DEPT 테이블에서 부서번호가 50인 부서의 부서이름을 '경리부'로 변경하고 부서위치를 '부천시'로 변경
UPDATE DEPT SET DNAME='경리부',LOC='부천시' WHERE DEPTNO=50;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM DEPT WHERE DEPTNO=50;
※ 부서이름 : 경리부, 부서위치 : 부천시
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
◈ 컬럼의 변경값은 컬럼의 자료형,크기,제약조건이 맞는 경우에만 변경 가능
UPDATE DEPT SET LOC='부천시 원미구' WHERE DEPTNO=50;
※ 에러 발생 : 변경값의 LOC 컬럼의 크기보다 커서 에러 발생
◈ UPDATE 명령에서 서브쿼리를 사용 가능 : 변경값 또는 조건식의 비교값 대신 서브쿼리 사용
▦ DEPT 테이블에서 부서이름이 '영업부'인 부서위치(NULL)를 총무부의 부서위치(인천시)와 같도록 변경
SELECT * FROM DEPT;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─UPDATE DEPT SET LOC=(SELECT LOC FROM DEPT WHERE DNAME='총무부') WHERE DNAME='영업부';
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM DEPT;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
◈ BONUS 테이블에서 사원이름이 KIM인 사원보다 성과급이 적은 사원의 성과급을 100 증가되도록 변경
SELECT * FROM BONUS;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─UPDATE BONUS SET COMM=COMM+100 WHERE COMM<(SELECT COMM FROM BONUS WHERE ENAME='KIM');▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM BONUS;▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
형식) DELE FROM 테이블명 [WHERE 조건식]
◈ WHERE의 조건식이 참인 행만 검색하여 삭제 처리
◈ WHERE가 생략된 경우 테이블에 저장된 모든 행 삭제
◈ WHERE에서 사용되는 조건식의 컬럼은 PK 제약조건이 부여된 컬럼을 사용하는 것을 권장 - 단일행을 검색하여 삭제
▦ DEPT 테이블에서 부서번호가 90인 부서정보 삭제
SELECT * FROM DEPT;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─DELETE FROM DEPT WHERE DEPTNO=90;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM DEPT;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
▦ DEPT 테이블에서 부서번호가 10인 부서정보 석제
◈ 자식 테이블에서 참조되는 부모 테이블의 컬럼값은 FK 제약조건에 의해 삭제 처리 불가능
◈ FK(FOREIGN KEY) 제약조건 : 자식 테이블의 컬럼값이 부모 테이블의 컬럼값을 참조하여 저장되도록 설정하는 제약조건
◈ EMP 테이블(자식 테이블)의 부서번호(DEPTNO)는 DEPT 테이블(부모 테이블)의
부서번호(DEPTNO)를 참조하여 저장되도록 FK 제약조건 부여DELETE FROM DEPT WHERE DEPTNO=10;
※ 에러 발생 : FK 제약조건을 위반하여 에러 발생
▦ EMP 테이블에 저장된 모든 사원의 부서번호를 중복되지 않은 유일한 부서번호로 검색
◈ DEPT 테이블에서는 EMP 테이블이 참조하지 않는 부서정보만 삭제 가능
SELECT DISTINCT DEPTNO FROM EMP;
※ 검색결과 : 10,20,30,40
▦ DEPT 테이블(부모 테이블)에서 부서번호가 20인 부서정보 삭제
DELETE FROM DEPT WHERE DEPTNO=20;
※ 에러 발생 : FK 제약조건에 의해 에러 발생
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─▦ DEPT 테이블(부모 테이블)에서 부서번호가 80인 부서정보 삭제
DELETE FROM DEPT WHERE DEPTNO=80;
SELECT * FROM DEPT;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
◈ DELETE 명령에서 서브쿼리 사용 가능 - WHERE의 조건식에 비교값 대신 서브쿼리 사용
◈ DEPT 테이블에서 부서이름이 영업부인 부서와 같은 부서위치의 부서정보 삭제(영업부 포함)SELECT * FROM DEPT;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─DELETE FROM DEPT WHERE LOC=(SELECT LOC FROM DEPT WHERE DNAME='영업부');
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM DEPT;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
◈ MERGE : 원본 테이블의 행을 검색하여 타겟 테이블에 행을 삽입하거나 타켓테이블에 저장된 행의 컬럼값을 변경하는 명령
형식) MERGE INTO 타켓테이블명 USING 원본테이블명 ON (조건식)
WHEN MATCHED THEN UPDATE SET 타켓컬럼명=원본컬럼명,타켓컬럼명=원본컬럼명,...
WHEN NOT MATCHED THEN INSERT(타켓컬럼명,타켓컬럼명,...) VALUES(원본컬럼명,원본컬럼명,...)▦ DEPT 테이블과 동일한 속성의 MERGE_DRPT 테이블 생성
DESC DEPT;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─CREATE TABLE MERGE_DEPT(DEPTNO NUMBER(2),DNAME VARCHAR2(14),LOC VARCHAR2(13));
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─DESC MERGE_DEPT;
───────────────────────────────────────
◈ MERGE_DEPT 테이블에 행 삽입INSERT INTO MERGE_DEPT VALUES(30,'총무부','서울시');
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─INSERT INTO MERGE_DEPT VALUES(60,'자재부','수원시');
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM MERGE_DEPT;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
◈ DEPT 테이블(원본 테이블)에 저장된 모든 부서정보를 검색하여 MERGE_DEPT 테이블(타켓테이블)에 행을 삽입하거나 MERGE_DEPT 테이블에 저장된 행의 컬럼값을 변경
SELECT * FROM DEPT;
※ 원본 테이블
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM MERGE_DEPT;
※ 타겟 테이블
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─MERGE INTO MERGE_DEPT M USING DEPT D ON(M.DEPTNO=D.DEPTNO) WHEN MATCHED THEN UPDATE SET M.DNAME=D.DNAME,M.LOC=D.LOC WHEN NOT MATCHED THEN INSERT(M.DEPTNO,M.DNAME,M.LOC) VALUES(D.DEPTNO,D.DNAME,D.LOC);※ 잘안씀</span
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM MERGE_DEPT;