[Oracle] DML(DATA MANIPLATION LANGUAGE)

chael_lo·2021년 7월 5일
0

Oracle

목록 보기
17/17

DML(DATA MANIPLATION LANGUAGE)

데이타 조작어라고 불리며,
테이블의 행에 대한 삽입,변경,삭제 기능을 제공하는 SQL 명령을 말한다.
DML 명령 실행 후 COMMIT(DML 명령 적용) 또는 ROLLBACK(DML 명령 취소) 명령을 실행하는 것을 권장한다.

INSERT

테이블에 행을 삽입하여 저장하는 명령이다.
테이블에 삽입될 행의 컬럼값은 테이블 속성에 맞게 차례대로 나열하여 저장되도록 작성한다.
테이블에 선언된 컬럼 순서대로 자료형에 맞는 값을 생략없이 전달하여 저장한다.

형식)
INSERT INTO 테이블명 VALUES(컬럼값,컬럼값,...)

INSERT 특징

삽입행에 전달될 컬럼값의 갯수가 테이블의 컬럼 갯수와 맞지 않을 경우 에러가 발생한다.

--SQL 오류: ORA-00947: not enough values
INSERT INTO DEPT VALUES(60,'총무부');

--SQL 오류: ORA-00913: too many values
INSERT INTO DEPT VALUES(60,'총무부','인천','02-1234-5678');

삽입행에 전달될 컬럼값이 테이블의 컬럼 자료형과 맞지 않거나 자료형의 크기보다 큰 경우 에러가 발생한다.

--오류 보고 - ORA-01722: invalid number
INSERT INTO DEPT VALUES('육십','총무부','인천');
--오류 보고 - ORA-12899: value too large for column "SCOTT"."DEPT"."LOC" (actual: 19, maximum: 13)
INSERT INTO DEPT VALUES(60,'총무부','인천시 월미구');

테이블의 컬럼에 부여된 제약조건을 위반하는 값이 전달될 경우 에러가 발생한다.

NOT NULL 제약조건
컬럼에 NULL이 저장되지 않도록 설정하는 제약조건

--오류 보고 - ORA-01400: cannot insert NULL into ("SCOTT"."DEPT"."DEPTNO")
INSERT INTO DEPT VALUES(NULL,'총무부','인천');

테이블에 행 삽입시 컬럼값을 저장하고 싶지 않은 경우 NULL를 전달하여 저장한다.

--명시적 NULL 저장
INSERT INTO DEPT VALUES(70,'영업부',NULL);

테이블의 원하는 속성에만 컬럼값을 전달하여 행을 삽입하여 저장이 가능하다.

형식)
INSERT INTO 테이블명(컬럼명,컬럼명,...) VALUES(컬럼값,컬럼값,...)

--INSERT 명령의 테이블에 나열된 컬럼 순서대로 컬럼값을 전달하여 행 삽입
INSERT INTO DEPT(LOC,DEPTNO,DNAME) VALUES('수원',80,'자재부');

INSERT 명령의 테이블에 나열된 컬럼은 생략이 가능하다.

생략된 컬럼에는 컬럼 기본값(DEFAULT VALUE)이 자동 저장된다.
테이블 생성 또는 테이블 구조 변경시 컬럼 기본값을 설정하지 않은 경우,
컬럼 기본값은 자동으로 NULL로 설정된다.

--LOC 컬럼 생략 : NULL 저장 - 묵시적 NULL 저장
INSERT INTO DEPT(DEPTNO,DNAME) VALUES(90,'인사부');

INSERT 명령에서 SUBQUERY 사용이 가능하다.

테이블의 행을 검색하여 검색결과를 다른 테이블의 행으로 삽입한다(테이블 행 복사).
행이 삽입될 테이블의 속성과 서브쿼리의 검색대상에 대한 구조(갯수,자료형,크기)가 동일하다(컬럼명 제외).

형식)
INSERT INTO 테이블명 SELECT 검색대상,... FROM 테이블명 [WHERE 조건식]

UPDATE

테이블에 저장된 행의 컬럼값을 변경하는 명령이다.

형식)
UPDATE 테이블명 SET 컬럼명=변경값,컬럼명=변경값,... WHERE 조건식

UPDATE 특징

PK 제약조건이 설정된 컬럼값은 변경하지 않는 것을 권장한다.

WHERE 구문이 생략된 경우 테이블에 저장된 모든 행의 컬럼값을 동일하게 변경한다.

조건식에서 사용될 컬럼은 PK 제약조건이 설정된 컬럼을 사용하는 것을 권장한다.

변경값은 컬럼의 자료형,크기,제약조건에 맞는 경우에만 변경이 가능하다.

--EMP 테이블에서 사원번호가 9000인 사원의 부서번호를 35로 변경
--FK 제약조건을 위반하여 에러 발생
UPDATE EMP SET DEPTNO=35 WHERE EMPNO=9000;

UPDATE 명령에서 서브쿼리 사용이 가능하다.

변경값 또는 조건식의 비교값 대신 서브쿼리 사용

--DEPT 테이블에서 부서명이 영업부인 부서위치(NULL)를 총무부의 부서위치(인천)와 같도록 변경

UPDATE DEPT SET LOC=(SELECT LOC FROM DEPT
WHERE DNAME='총무부') WHERE DNAME='영업부';

DELETE

테이블에 저장된 행을 삭제하는 명령이다.

형식)
DELETE FROM 테이블명 WHERE 조건식

DELETE 특징

WHERE 구문이 생략된 경우 테이블에 저장된 모든 행을 삭제한다.

조건식에서 사용될 컬럼은 PK 제약조건이 설정된 컬럼을 사용하는 것을 권장한다.

FK 제약조건에 의해 자식 테이블(EMP)이 참조하는 부모 테이블(DEPT)의 행은 삭제 불가능하다.

DELETE FROM DEPT WHERE DEPTNO=10;

DELETE 명령에서 서브쿼리 사용 가능하다.

--조건식의 비교값 대신 서브쿼리 사용
--DEPT 테이블에서 부서이름이 영업부인 부서와 같은 부서위치의 부서정보 삭제 - 영업부 포함
DELETE FROM DEPT 
WHERE LOC=(SELECT LOC FROM DEPT WHERE DNAME='영업부');

PK(PRIMARY KEY) 제약조건

기존 행의 컬럼값과 같은 값이 저장되지 않도록 설정하는 제약조건

--오류 보고 - ORA-00001: unique constraint (SCOTT.PK_DEPT) violated
SELECT * FROM DEPT WHERE DEPTNO=50;
INSERT INTO DEPT VALUES(50,'총무부','인천');

FK(FOREIGN KEY) 제약조건

부모 테이블에 저장된 컬럼값만 자식 테이블의 컬럼에 저장되도록 설정하는 제약조건

--DEPT 테이블(부모 테이블)에 35인 부서번호가 저장되어 있지 않아 EMP 테이블(자식 테이블)에 행 삽입시 에러 발생
--오류 보고 - ORA-00001: unique constraint (SCOTT.PK_EMP) violated
INSERT INTO EMP VALUES(9000,'KIM','MANAGER',7298,'00/12/10',3500,1000,35);
INSERT INTO EMP VALUES(9000,'KIM','MANAGER',7298,'00/12/10',3500,1000,40);

테이블 속성 확인

컬럼과 자료형 확인을 하기 위해 사용하는 명령이다.

형식)
DESC 테이블명
profile
천천히 꾸준히

0개의 댓글