Search
castle

DML

image.png

  • 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 특정COLUMNULL 삽입방법 (명시적)
INSERT INTO DEPT(DEPTNO,DNAME,LOC) VALUES(52, '북부지점',NULL); // 'NULL'  다른점은?
INSERT INTO DEPT(DEPTNO,DNAME,LOC) VALUES(53, '남부지점','');

// INSERT 특정COLUMNULL 삽입방법 (암시적)
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; // 결과 조회

image.png

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

image.png

  • commit 후

image.png

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);// 변경내역조회

image.png

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

image.png

select dname, replace(dname,' ','*') from dept; // dname컬럼에 공백문자 저장

update dept set dname=trim(dname); // set 절에 함수 사용가능

select dname, replace(dname,' ','*') from dept;

image.png

image.png

DELETE

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

image.png

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

SELECT * FROM DEPT;

image.png

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

SELECT * FROM DEPT;

image.png

left
right

C

Contents