💡INSERT
INSERT는 DML의 한 종류이다.
테이블에 데이터를 추가하는 명령어이다.
INSERT 구문
insert into 테이블명 (컬럼리스트) values (값리스트)
INSERT의 사용
DROP TABLE tblMemo;
CREATE TABLE tblMemo
(
seq number(3) PRIMARY KEY, --메모번호(PK)
name varchar2(30) DEFAULT '익명', --작성자(UQ)
memo varchar2(1000), --메모(NN)
regdate DATE DEFAULT sysdate NOT NULL --작성날짜
);
DROP SEQUENCE seqMemo;
CREATE SEQUENCE seqMemo;
SELECT * FROM tblMemo;
INSERT를 사용하기 전에 필요한 테이블과 시퀀스를 생성해 주었다.
표준적인 INSERT 구문
INSERT INTO tblMemo (seq, name, memo, regdate) values(seqMemo.nextVal, 'Isaac', 'Memo입니다.', sysdate);
원본 테이블에 정의된 컬럼 순서대로 컬럼리스트와 값리스트를 구성하는 방법을 말한다.
특별한 이유가 없다면 이 방식을 사용하는 게 권장된다.
컬럼리스트 순서
INSERT INTO tblMemo (seq, memo, regdate, name) values(seqMemo.nextVal, 'Memo입니다.', sysdate, 'Isaac');
컬럼리스트의 순서는 원본 테이블과 상관이 없다.
단, 컬럼리스트와 값리스트의 순서는 동일해야 한다.
ORA-00947: not enough values
INSERT INTO tblMemo (seq, name, memo, regdate) values(seqMemo.nextVal, 'Memo입니다.', sysdate);
값이 모자른 경우에 에러를 출력한다.
ORA-00913: too many values
INSERT INTO tblMemo (seq, memo, regdate) values(seqMemo.nextVal, 'Isaac', 'Memo입니다.', sysdate);
이번에는 컬럼이 3개인데 값을 4개를 주었다.
앞의 오류와 반대로 값이 너무 많다는 오류를 반환한다.
null 컬럼 조작
--null 상수
INSERT INTO tblMemo (seq, name, memo, regdate) values(seqMemo.nextVal, 'Isaac', null, sysdate);
--컬럼 생략
INSERT INTO tblMemo (seq, name, regdate) values(seqMemo.nextVal, 'Isaac', sysdate);
null 상수를 사용하는 방법과 컬럼을 생략하는 방법으로 null 컬럼을 조작할 수 있다.
default 컬럼 조작
--컬럼 생략
INSERT INTO tblMemo (seq, memo, regdate) values(seqMemo.nextVal, 'Memo입니다.', sysdate);
컬럼을 생략하는 순간 null이 대입되고, default를 호출한다.
--null 상수
INSERT INTO tblMemo (seq, name, memo, regdate) values(seqMemo.nextVal, null, 'Memo입니다.', sysdate);
개발자의 의도가 null을 입력한 것으로 인식하여 default가 동작되지 않고, null이 들어간다.
--default 상수
INSERT INTO tblMemo (seq, name, memo, regdate) values(seqMemo.nextVal, default, 'Memo입니다.', sysdate);
default 상수를 입력하여 default를 호출할 수 있다.
생략
INSERT INTO tblMemo values(seqMemo.nextVal, 'Isaac', 'Memo입니다.', sysdate);
--ORA-01841: (full) year must be between -4713 and +9999, and not be 0
INSERT INTO tblMemo values(seqMemo.nextVal, 'Memo입니다.', sysdate, 'Isaac');
컬럼리스트를 생략하여 사용할 수 있다.
컬럼시트를 생략하면 테이블의 원본 컬럼 순서대로 값리스트를 작성해야 한다. 머릿속에 원본 테이블의 순서를 외우고 있어야만 쓸 수 있다.
자주 쓰는 테이블이 아니라면 컬럼리스트를 생략하여 사용하는 게 힘들다.
--ORA-00947: not enough values
INSERT INTO tblMemo values(seqMemo.nextVal, 'Isaac', sysdate);
INSERT INTO tblMemo values(seqMemo.nextVal, 'Isaac', null, sysdate);
--ORA-00947: not enough values
INSERT INTO tblMemo values(seqMemo.nextVal, 'Memo입니다.', sysdate);
INSERT INTO tblMemo values(seqMemo.nextVal, DEFAULT, 'Memo입니다.', sysdate);
null 컬럼 또는 default 컬럼을 생략할 수 없다.
테이블을 복사하여 새 테이블(tblMemoCopy) 생성
CREATE TABLE tblMemoCopy
(
seq number(3) PRIMARY KEY, --메모번호(PK)
name varchar2(30) DEFAULT '익명', --작성자(UQ)
memo varchar2(1000), --메모(NN)
regdate DATE DEFAULT sysdate NOT NULL --작성날짜
);
SELECT * FROM tblMemo;
SELECT * FROM tblMemoCopy;
INSERT INTO tblMemoCopy SELECT * FROM tblMemo; --Sub Query
8건의 INSERT가 발생하였다.
이를 Sub Query 기술이라고 한다.
테이블을 복사하여 새 테이블(tblMemoCopy2) 생성
CREATE TABLE tblMemoCopy2 AS SELECT * FROM tblMemo;
SELECT * FROM tblMemoCopy2;
INSERT INTO tblMemoCopy2 (seq, name, memo, regdate) values(9, 'Isaac', 'Memo입니다.', sysdate);
완전히 동일한 테이블을 하나 생성한다는 점에서 위의 복사와 차이가 있다.
그런데 데이터를 넣어 보니 제약 사항이 복사되지 않는것을 확인할 수 있다.
복사된 테이블은 공간만 존재할 뿐이고 구조가 없어 실사용할 수 없다.
주로 다량의 임시 데이터를 사용할 때와 더미데이터를 만들 때 사용한다.
💡UPDATE
UPDATE는 DML의 한 종류이다.
원하는 행의 원하는 컬럼값을 수정하는 명령어이다.
UPDATE 구문
update 테이블명 set 컬럼명=값 [컬럼명=값] x N [WHERE절]
UPDATE의 사용
UPDATE tblCountry SET capital = '세종';
UPDATE문은 기본적으로 모든 데이터를 변환하므로 사용에 주의해야 한다.
만약 이게 회원의 주소였다면 1400명의 주소를 모두 한 명의 주소로 바꿔버릴 수도 있다.
민사소송을 당하고 싶다면 WHERE절을 사용하지 않으면 된다.
WEHRE절 지정
UPDATE tblCountry SET capital = '세종' WHERE name = '대한민국';
다중 컬럼리스트 수정
UPDATE tblCountry SET
capital = '세종',
population = population + 100,
continent = 'EU'
WHERE name = '대한민국';
💡DELETE
DELETE는 DML의 한 종류이다.
원하는 행의 원하는 컬럼값을 수정하는 명령어이다.
DELETE 구문
delete [from] 테이블명 [where절]
from은 생략할 수 있다.
DELETE의 사용
SELECT * FROM tblinsa;
DELETE FROM tblInsa WHERE num = 1001;
DELETE FROM tblInsa;
데이터를 모두 삭제하였다.
이제 민사소송을 준비하도록 하자.