본문 바로가기

DataBase/Oracle

Chapter 4 데이터 조작어(DML) - PLT 4.1 INSERT, UPDATE, DELETE

Chapter 4 데이터 조작어(DML)

DML(Data Manipulation Language) 명령은 데이터를 입력,수정,삭제하는 SQL명령어이다. 데이터베이스에 영구적으로 반영되지 않은 데이터 조작 명령어들을 TRANSACTION이라고 하며 오라클에서는 이를 하나의 논리적 작업 단위로 사용한다.
 
명 령 어
   
INSERT
테이블에 새로운 행 추가
UPDATE
테이블의 행 내용을 변경
DELETE
테이블의 행 삭제
COMMIT
저장되지 않은 모든 변경 사항을 Database에 저장
SAVEPOINT
savepoint 설정
ROLLBACK
저장되지 않은 보든 변경 사항을 취소
 
PLT 4.1 INSERT
 
INSERT INTO table_name [(column1[, column2, . . . . . ])]
VALUES  (value1[, value2, . . . . . . ]);
n         VALUES절을 가지는 INSERT문장은 한번에 오직 하나의 행만을 추가한다.
n         모든 행에 값을 갖는 새로운 행을 삽입할 수 있기 때문에 column list INSERT절에 필요하지 않다. 하지만 테이블에 정의된 순서에 따라 값을 나열해야 한다.
n         명확성을 위해 INSERT절에 column list를 사용하면 좋다.(권장)
n         문자와 날짜는 단일 따옴표 안에 쓰나, 수치 값은 사용하지 않는다.
n         INSERT 절의 column은 선택적으로 기입할 수 있다. 이럴 경우 열중 NOT NULL 제약 조건이 있는 열은 반드시 포함하여야 한다.
 
SQL> DESC emp
 Name                            Null?    Type
 ------------------------------- -------- ----
 EMPNO                           NOT NULL NUMBER(4)
 ENAME                                    VARCHAR2(10)
 JOB                                      VARCHAR2(9)
 MGR                                      NUMBER(4)
 HIREDATE                                 DATE
 SAL                                      NUMBER(7,2)
 COMM                                     NUMBER(7,2)
 DEPTNO                          NOT NULL NUMBER(2)
 
SQL> INSERT INTO emp
  2  VALUES (1111,'YOONJB','',NULL,SYSDATE,3000,NULL,10);
 
1 row created.
 
NULL 값 입력
자료형에 관계없이 사용 가능하다.
 
암시적 방법
SQL> INSERT INTO dept(deptno,dname)
  2  VALUES (50,'DEVELOPMENT');
 
 
명시적 방법
SQL> INSERT INTO dept
  2  VALUES(60,'',NULL);
 
 
특정 날짜 값 삽입
형식 DD-MON-YY는 항상 날짜 값을 입력할 때 사용한다. 이 형식은 현재 세기에 대한 DEFAULT 세기를 다시 호출한다. 또한 날짜가 시간 정보를 포함하므로 DEFAULT 시간은 자정(00:00:00)이다. 날짜를 다른 세기로 입력하거나 또는 특정 시간을 요구 한다면 TO_DATE함수를 사용하여라.
날짜 변환식
변환된 결과
TO_DATE('1999','YYYY')
1999/02/01 00:00:00
TO_DATE('99','YY')
1999/02/01 00:00:00
TO_DATE('02','MM')
1999/02/01 00:00:00
TO_DATE('13','DD')
1999/02/13 00:00:00
TO_DATE('10','HH24')
1999/02/01 10:00:00
 
치환 변수를 사용하여 값 입력
SQL*Plus의 치환 변수를 사용하여 사용자가 상호 작용으로 값을 추가할 수 있다. 날짜와 문자 값은 단일 인용 부호를 사용하여 감싸는 것이 사용하기에 편하고 SCRIPT로 작성하여 사용하면 입력시 매우 유용하다.
 
SQL> ed dept_insert
 
INSERT INTO dept (deptno,dname,loc)
VALUES (&department_id,'&department_name','&location');
 
SQL> @dept_insert
Enter value for department_id: 70
Enter value for department_name: EDUCATION
Enter value for location: ATLANTA
old   2: VALUES (&department_id,'&department_name','&location')
new   2: VALUES (70,'EDUCATION','ATLANTA')
 
1 row created.
 
다른 테이블로부터 행 복사
기존의 테이블로부터 값을 가져와 테이블에 추가하기 위해서 INSERT문장을 사용할 수 있다. VALUES절에서 subquery를 사용할 수 있다.
 
INSERT INTO table_name  [column1[,column2, . . . .]]  subquery;
INSERT절의 열의 개수와 서브쿼리의 열의 개수가 좌측부터 11대응하며 자료형과 길이가 같아야 한다.
 
PLT 4.2 UPDATE
n         UPDATE문장으로 기존의 행을 갱신합니다.
n         일반적으로 단일 행을 식별하기 위해서 기본 키(primary key)를 사용합니다. 다른 열을 사용하면 원하지 않는 여러 행이 갱신될 수 있습니다.
n         특정 열이나 행은 WHERE절을 이용하여 갱신할 수 있다.
 
UPDATE                   table_name
SET                            column1 = value1 [,column2 = value2, . . . . . . .]
[WHERE                   condition];
 
SQL> UPDATE emp
  2  SET deptno = 20, sal = 3500
  3  WHERE empno = 7788;
 
1 row updated.
 
다중 열 SUBQUERY로 갱신
다중 열 SUBQUERY UPDATE문장의 SET절로 구현할 수 있다.
 
UPDATE table_name
SET (column1, column2, . . . . ) =
                ( SELECT column1,column2, . . .
                  FROM table_name
                  WHERE coundition)
[WHERE condition];
 
SQL> UPDATE emp
  2  SET (job,sal) = (SELECT job,sal
  3  FROM emp
  4  WHERE ename = 'SCOTT')
  5  WHERE ename = 'JONES';
 
1 row updated.
다른 테이블을 근거로 한 행 갱신
다른 테이블의 값을 근거로 하는 테이블에서 행을 갱신하기 위해 UPDATE문장에서 SUBQUERY를 사용한다.
 
SQL> UPDATE employee
  2  SET deptno = (SELECT deptno
  3  FROM emp
  4  WHERE empno = 7902)
  5  WHERE job = (SELECT job
  6  FROM emp
  7  WHERE empno = 7902);
 
2 rows updated.
 
PLT 4.3 DELETE
n         DELETE 문장을 사용하여 테이블로부터 기존의 자료를 삭제할 수 있다.
n         WHERE절을 명시하여 특정 행이나 행들을 삭제할 수 있다.
n         WHERE절을 생략하면 테이블의 모든 행이 삭제 된다.
 
DELETE [FROM] table_name
[WHERER condition];
 
SQL> DELETE emp
  2  WHERE TO_CHAR(hiredate,'YY') = '83';
 
1 row deleted.
 
다른 테이블을 근거로 한 행 삭제
다른 테이블을 값을 근거로 행을 삭제하기 위해서는 SUBQUERY를 사용하여야 한다.
 
SQL> DELETE emp
  2  WHERE deptno = (SELECT deptno
  3                  FROM dept
  4                  WHERE dname = 'SALES');