Data Manipulation Language(DML), 즉 데이터 조작어. 즉 데이터를 Create, Read, Update, Delete(CRUD)하는 언어이다. DML에서 CRUD에 대응되는 명령어는 다음과 같다:
Syntax of the create Table without Constraints/Reference:
create table TableName(
ColumnName1 DataType(Size-add'l) default defaultValues(add'l) null/not null(add'l)
...);
create table tbl_dml_test(
column_a varchar2(10) not null,
column_b date default sysdate not null,
column_c number);
가장 기본이 되는 Table 생성 구조로, 각 Column명, 해당 Colum에 대입될 값의 Datatype과 그 크기, default값 부여, null값 허용 여부 설정의 순서로 선언한다. 또한 Table 생성 시에 기존의 Table내 데이터들과 Subquery를 활용할 수도 있으며, 그 문법은 다음과 같다:
Syntax of the create Table with Subqeury:
create table TableName(
as
select Cols from Table where Conditions);
create table emp_test1(
as
select * from employee);
--OR
create table emp_test2(
as
select emp_name from employee);
해당 문법에서 as 이후에 작성된 코드들은 일종의 Subquery로, Parentheses 없이 as의 후위에 작성하여 기존 테이블의 데이터를 다른 테이블에 추가하여 생성할 수 있다. 단, Subquery를 사용하여 테이블을 생성하면 default 값 설정이 삭제되므로, 다음과 같은 별도의 수정 조치가 필요하다:
Syntax of the modifying default Vals/Tab:
alter table TabName modify Col default (defaultVal);
alter table emp_test1 modify quit_yn default 'N';
alter table emp_test2 modify hire_Date default sysdate;
Syntax of the insert into(1):
insert into TableName values (Col1Value Col2Value Col3Value ...);
insert into TableName (Col1, Col2 ...) values (Col1Value, Col2Value ...)
--SYNTAX(1)
insert into tbl_dml_test values ('test', default, 100);
--SYNTAX(2)
insert into tbl_dml_test(col1, col2) values('test', default);
새로운 행을 추가하는 것. 문법은 두 가지로, 해당 Table에 존재하는 모든 Columns에 값을 대입하는 경우와, 특정 Column을 명시적으로 선언하여 해당 Columns에만 값을 대입하는 방법이 있다. 전자의 경우, 반드시 값 대입시에 선언한 모든 Columns에 해당하는 값을 선언하여야 하며, 모든 값을 선언하지 않는 경우 not enough values 에러가 발생한다. 후자의 경우 null을 허용하거나, default값이 정해진 Column의 경우는 값대입 생략이 가능하다. 단, 생략시엔 해당 ColumnName과 ColumnValue 둘 다 제외하고 선언하여야 한다.
Syntax of the update:
update TableName
set ColName = ColValue
where Condition(add'l)
update emp_test1
set email = 'codepark.kr@gmail.com'
where emp_id = '302'
Column의 갯수는 달라지지 않고, 각 행에 도입된 값만 바꾸는 명령어. where절의 조건문은 생략이 가능하지만, 조건문을 생략하고 update하는 경우 명시한 모든 테이블의 모든 행에 set한 데이터가 일괄적으로 반영된다. 상상만 해도 무섭다. 잘못하면 진짜 jot되고 시말서 쓴다. DML의 특성상 commit/rollback은 사용자가 반드시 명시해줘야 한다. 올바른 시점에서의 commit을 반드시 생활화하자!
또한 update문에도 다음과 같이 Subquery를 사용할 수 있다:
Syntax of the update statement with Subquery:
update Table1
set Col1 = (select Col1 from Tab2 where Condition1),
Col2 = (select Col2 from Table3 where Condition2)
where Condition;
update emp_test1
set job_code =
(select job_code from job where job_name = '과장'),
dept_code = (select dept_id
from department
where dept_title = '해외영업3부')
where emp_name = '임시환'
Syntax of the delete statement:
delete from TabName
where condition
delete from emp_test1
where emp_name = 'codePark';
마찬가지로 where+Condition으로 조건문을 선언하여 삭제를 원하는 Col.Val만 따로 걸러주지 않는다면 선언한 TabName의 모든 Col이 삭제된다! 반드시 where절의 조건문을 사용하여 삭제를 원하는 데이터를 특정하여야 하고, commit을 생활화하여야 한다.
Syntax of the truncate Statement:
truncate table TabName;
truncate table emp_test1;
delete와 유사한 역할을 하는 것으로 truncate가 존재하나, 이는 DDL이기 때문에 자동으로 commit된다. DML은 사용시에 Before Image라는 것을 생성하고, rollback을 실행 시에 이 Before Image를 이용하기 때문에 이전 작업 내용의 복구가 가능하다. 하지만 DDL은 Before Image 생성 없이 실행되므로 처리 속도가 DML에 비해 상대적으로 빠르지만 복구가 불가능하다.
즉 truncate와 delete의 차이는: delete는 DML, truncate는 DDl이므로 rollback을 통한 복구 가능 여부이다. 또한 delete(삭제)는 Table 자체를 삭제하는 것이고 truncate(버림)는 Table에 존재하는 모든 데이터를 삭제하는 것이므로 이 두 절차 이후 select * from TabName을 하게 되면 전자는 Table 자체가 조회되지 않고, 후자의 경우 해당 Table과 ColumnName들은 그대로 조회가 가능하다. (단 Column 내의 값들은 전부 비어있는 상태이다.)
DML을 사용한 코드 작업 후 DDL을 사용한 코드 작업을 하게 되면 DDL에 의해 자동 commit이 이루어지므로 rollback을 하더라도 DDL 작업 이전의 DML 작업 내용으로 돌릴 수 없게 된다! 따라서 DDL을 통한 작업 이전에 반드시 DML로 작업한 변경 사항들에 문제가 없고, 추가로 변경할 사항이 없는지 확인한 후에 DDL 작업을 시작하는 것이 권장된다.