DML

- DML : data를 manipulation(조작)하는 명령
- TCL
- ex) process : COMMIT(저장) → ROLLBACK(취소), 저장 이전 상태( - -ammend)
INSERT
desc table: columns, type- type : type(data max byte)
desc dept;
desc emp;
이름 널? 유형
------ -- ------------
DEPTNO NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
이름 널? 유형
-------- -------- ------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2) // 총 7자리, 정수 5, 소숫자리 2
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
INSERT INTO [table]([columns]) VALUES([values])
- table 내 colums에 data 삽입
[columns]생략 시 전체 columns 대상VALUES함수 적용 가- 생략된 columns → NULL로 채움
- 명시적(
NULL,''), 암시적(column 생략) 방법- 명시적 생성 → NULL data 처리 가능(
NVL등)- 암시적 생성 → NULL data 처리 x
- colums, values 1대1 대응
SELECT * from DEPT;
INSERT INTO DEPT VALUES(50,'연구소1','서울');// 컬럼명 생략시 전체컬럼대상
INSERT INTO DEPT(DEPTNO,DNAME,LOC) VALUES(51,'연구소2','대전');// 좋은방식의SQL 작성은?
-- 컬럼명과 VALUE(값)을1:1로 매핑, 테이블에 정의된 컬럼 순서 필요(X)
SELECT * FROM DEPT; // 신규 삽입 데이터 조회
INSERT INTO DEPT VALUES('중부영업점','대구'); // ERROR의 이유는?
-- DESC DEPT ➔3개 컬럼 정의 , 2개의 데이터만 삽입시 에러 발생
INSERT INTO DEPT(DNAME,LOC) VALUES('중부영업점','대구'); // 여전히ERROR인 이유는?
-- ORA-12899: "SCOTT"."DEPT"."DNAME" 열에 대한 값이 너무 큼(실제: 15, 최대값: 14)
-- 한글저장시 1글자당 3 Bytes 할당시 ,
-- 중부영업점은 15 Bytes 할당으로 컬럼의 최대 저장 길이 초과 (DNAME VARCHAR2(14) )
INSERT INTO DEPT(DNAME,LOC) VALUES('중부지점','대구');
-- INSERT시 생략된 컬럼(ex DEPTNO)은 NULL
-- DEPTNO NOT NULL 인경우
-- " ORA-01400: NULL을("SCOTT"."DEPT"."DEPTNO") 안에 삽입할 수 없습니다. " 발생
// INSERT시 특정COLUM에NULL 삽입방법 (명시적)
INSERT INTO DEPT(DEPTNO,DNAME,LOC) VALUES(52, '북부지점',NULL); // 'NULL' 과 다른점은?
INSERT INTO DEPT(DEPTNO,DNAME,LOC) VALUES(53, '남부지점','');
// INSERT시 특정COLUM에NULL 삽입방법 (암시적)
INSERT INTO DEPT(DEPTNO,DNAME) VALUES(54,'서부지점'); // 대상 컬럼 생략
SELECT DEPTNO,DNAME,NVL(LOC,'미지정지역') AS LOC FROM DEPT; // 결과 조회
COMMIT; // 변경사항DB에 영구히 반영
- data size(byte) 고려 : 초과 시 error
INSERT INTO DEPT VALUES('중부영업점','대구'); // ERROR의 이유는?
-- DESC DEPT ➔3개 컬럼 정의 , 2개의 데이터만 삽입시 에러 발생
오류 보고 -
SQL 오류: ORA-00947: 값의 수가 충분하지 않습니다
00947. 00000 - "not enough values"
*Cause:
*Action:
명령의 13 행에서 시작하는 중 오류 발생 -
INSERT INTO DEPT(DNAME,LOC) VALUES('중부영업점','대구')
오류 발생 명령행: 13 열: 36
INSERT INTO DEPT(DNAME,LOC) VALUES('중부영업점','대구'); // 여전히ERROR인 이유는?
-- ORA-12899: "SCOTT"."DEPT"."DNAME" 열에 대한 값이 너무 큼(실제: 15, 최대값: 14)
-- 한글저장시 1글자당 3 Bytes 할당시 ,
-- 중부영업점은 15 Bytes 할당으로 컬럼의 최대 저장 길이 초과 (DNAME VARCHAR2(14) )
오류 보고 -
SQL 오류: ORA-12899: "SCOTT"."DEPT"."DNAME" 열에 대한 값이 너무 큼(실제: 15, 최대값: 14)
12899. 00000 - "value too large for column %s (actual: %s, maximum: %s)"
*Cause: An attempt was made to insert or update a column with a value
which is too wide for the width of the destination column.
The name of the column is given, along with the actual width
of the value, and the maximum allowed width of the column.
Note that widths are reported in characters if character length
semantics are in effect for the column, otherwise widths are
reported in bytes.
*Action: Examine the SQL statement for correctness. Check source
and destination column data types.
Either make the destination column wider, or use a subset
of the source column (i.e. use substring).
SELECT DEPTNO,DNAME,NVL(LOC,'미지정지역') AS LOC FROM DEPT; // 결과 조회

- 작업중인 table 단위는 session 기준
- commit 전

- commit 후

UPDATE
table 내 저장된 기존 column, field 수정
UPDATE [TABLE] SET [[column]=[value]] WHERE …
[[column]=[value]]: 복수 N개 지정 가능, sep=,WHERE조건절 X → 전체 data 수정 ($\therefore$주의 필요)SET함수 적용 가능
UPDATE DEPT SET DNAME = ' M연구소' WHERE DEPTNO = 50;// 단일컬럼 변경
UPDATE DEPT SET DNAME = ' T연구소', LOC='인천' WHERE DEPTNO = 51; // 복수컬럼 변경
SELECT * FROM DEPT WHERE DEPTNO IN (50,51);// 변경내역조회

UPDATE DEPT SET LOC='미개척지'; // WHERE절 생략시 전체ROW 대상

select dname, replace(dname,' ','*') from dept; // dname컬럼에 공백문자 저장
update dept set dname=trim(dname); // set 절에 함수 사용가능
select dname, replace(dname,' ','*') from dept;


DELETE
TABLE 내에 저장된 기존 행(ROW, RECORD) 삭제
DELETE (FROM) [TABLE] (WHERE) …

FROM생략 가능- 전체 ROW 삭제 - 주의 필요
DELETE FROM DEPT WHERE LOC IS NULL or DEPTNO IS NULL;
SELECT * FROM DEPT;

DELETE DEPT;// WHERE절 생략시 전체ROW 삭제
-- FROM 생략 가능 , Delete Syntax Diagram을 읽어 확인
SELECT * FROM DEPT;

C
Contents
