#title INSERT/UPDATE/DELETE [[TableOfContents]] ==== INSERT ==== {{{#!geshi sql INSERT문은 데이타를 삽입할때 사용합니다. 기본적인 문법은 다음과 같습니다. INSERT INTO 테이블명(컬럼1, 컬럼2, ...) VALUES (DATA1, DATA2, ...); 데이타를 입력하려면 먼저 선행되어야 하는 것일 무엇일까요? 당연히 테이블을 만들어야 합니 다. 테이블을 만드는 것은 그리 간단한 일이 아닙니다. 현실에 존재하는 제약사항을 표현하고, 물리적인 것까지 고려해서 테이블을 생성해야 합니다. 일단 이 단원은 INSERT에 대한 개념을 이야기 하고자 하는 것이기 때문에 간략화한 문법만 소개하도록 하고, 그때 그때 필요한 것은 주석을 통해서 어떤 뜻인지만 알고 계시면 되겠습 니다. 자세한 것은 TABLE을 다루는 부분을 참고하시기 바랍니다. 초간단 TABLE 생성 문법 CREATE TABLE 테이블명 ( 컬럼명1 데이타형, 컬럼명2 데이타형, ....); 단순한 테이블한개를 생성하고, 하나의 행을 삽입해보도록 하겠습니다. 우선은 INSERT를 하기 위한 사용자를 하나 생성해 보도록 하겠습니다. 무슨 소리인지 모르시는 분들은 무조건 따라 하시거나 다른 책이나 웹문서를 참고하시기 바랍니다. SQL> CONNECT SYSTEM/MANAGER 연결되었습니다. SQL> CREATE USER INSERTER IDENTIFIED BY INSERTER 2 DEFAULT TABLESPACE USERS; 사용자가 생성되었습니다. SQL> GRANT CONNECT, RESOURCE TO INSERTER; 권한이 부여되었습니다. SQL> CREATE TABLE TEST_INSERT ( 2 ID NUMBER PRIMARY KEY, 3 NAME VARCHAR(10)); 테이블이 생성되었습니다. SQL> INSERT INTO TEST_INSERT VALUES(23, 'YASI'); 1 개의 행이 만들어졌습니다. SQL> SELECT * FROM TEST_INSERT; ID NAME ---------- ---------- 23 YASI SQL> -- 만약 컬럼의 순서를 바꾸어 입력하고 싶다면?? 컬럼의 순서를 바꿔 주면 된다. SQL> INSERT INTO TEST_INSERT(NAME, ID) VALUES ('이재학', 24); 1 개의 행이 만들어졌습니다. 여러분은 어떤 홈페이지에서 회원가입을 할 때 꼭 입력해야 하는 사항과 입력하지 않아도 되 는 사항들이 있는 것을 보았을 것입니다. 여기서 꼭 입력해야 한다는 것은 NOT NULL을 의미하 고 입력하지 않아도 되는 것은 NULL 값을 허용한다는 것입니다. 이러한 것은 어떤 식으로 입 력을 하는지 실습을 통해서 알아보도록 하겠습니다. 먼저 아래와 같은 테이블을 생성합니다. SQL> CREATE TABLE STUDENT( 2 S_NUM CHAR(7) PRIMARY KEY, 3 S_NAME VARCHAR(8) NOT NULL, 4 S_PHONE VARCHAR(11)); 테이블이 생성되었습니다. 컬럼의 수 보다 적은 데이타의 삽입 SQL> INSERT INTO STUDENT(S_NUM, S_NAME) VALUES('9555023', '이재학'); 1 개의 행이 만들어졌습니다. SQL> INSERT INTO STUDENT(S_NUM, S_NAME, S_PHONE) 2 VALUES('9555007', '나병우', '01198101134'); 1 개의 행이 만들어졌습니다. SQL> SELECT * FROM STUDENT; S_NUM S_NAME S_PHONE ------- -------- ----------- 9555023 이재학 9555007 나병우 01198101134 }}} ==== SEQUENCE ==== {{{#!geshi sql 여러분이 테이블을 만들고 일련번호 자동으로 삽입하고자 할 때가 있을 것입니다. 이럴 때는 오라클의 시퀀스라는 객체를 생성해 줘야합니다. 시퀀스는 자동으로 증가하는 숫자를 생성해 주는 객체입니다. 문법은 다음과 같습니다. CREATE SEQUENCE SEQUENCE_NAME INCREMENT BY 값 START WITH 값 MAXVALUE 값 / NOMAXVALUE MINVALUE 값 / NOMINVALUE CYCLE / NOCYCLE CACHE 값 / NOCACHE ORDER / NOODER; 주의해야할 옵션 몇개를 살펴보면 우선 MAXVLAUE/NOMAXVALUE가 잇는데 이 옵션은 시퀀스가 증 가 될 수 있는 최대값을 나타냅니다. MAXVALUE의 기본값은 1024입니다. NOMAXVALUE로 설정하 면 무한대로 값이 올라가게 됩니다. CYCLE이란 옵션은 시퀀스의 최대값에 도달하면 그 다음값 으로 최초의 값이 되는 것입니다. 기본값은 순환하는 값이 아닙니다. CACHE/NOCACHE라는 옵션 은 캐시를 사용하도록 지정하는 것입니다. 이값을 지정하지 않으면 기본적으로 오라클은 20개 의 값을 캐시합니다. 시퀀스 생성을 해보겠습니다.. SQL> create sequence seq_iii 2 increament by 1 3 start with 50 4 maxvalue 100 5 nocache 6 nocycle; increament by 1 * 2행에 오류: ORA-00933: SQL 명령어가 올바르게 종료되지 않았습니다 SQL> c /increament by 1/increment by 1 2* increment by 1 SQL> run 1 create sequence seq_iii 2 increment by 1 -- 1단위로 증가함 3 start with 50 -- 50부터 시작하는 시퀀스 4 maxvalue 100 -- 최대값 100 5 nocache 6* nocycle 주문번호가 생성되었습니다. SQL> select seq_iii.nextval from dual; NEXTVAL ---------- 50 SQL> select seq_iii.currval from dual; CURRVAL ---------- 50 SQL> create table seq_test (id number); 테이블이 생성되었습니다. SQL> create table seq_test (id number); 테이블이 생성되었습니다. SQL> insert into seq_test values (seq_iii.nextval); 1 개의 행이 만들어졌습니다. SQL> select * from seq_test; ID ---------- 51 SQL> -- 테이블 생성시 컬럼에 기본값을 설정해줬다면 INSERT시 다음과 같이 하면됨 SQL> ALTER TABLE STUDENT 2 ADD APPLY DATE DEFAULT SYSDATE; 테이블이 변경되었습니다. SQL> INSERT INTO STUDENT 2 VALUES ('9655023', '엄성재', '0164506701', DEFAULT); 1 개의 행이 만들어졌습니다. SQL> -- APPLY 컬럼에 기본값으로 현재 시스템의 날짜를 적용 SQL> SELECT * FROM STUDENT 2 WHERE S_NUM = '9655023'; S_NUM S_NAME S_PHONE APPLY ------- -------- ----------- -------- 9655023 엄성재 0164506701 02/05/19 SQL> -- DEFAULT 라는 키워드로 기본값이 들어감을 명시해 주지 않아도 기본값이 들어간다. SQL> INSERT INTO STUDENT(S_NUM, S_NAME, S_PHONE) 2 VALUES ('9555037', '전호중', '0172204580'); 1 개의 행이 만들어졌습니다. SQL> SELECT * FROM STUDENT 2 WHERE S_NUM = '9555037'; S_NUM S_NAME S_PHONE APPLY ------- -------- ----------- -------- 9555037 전호중 0172204580 02/05/19 시퀀스의 변경은 모두 생성문법과 같은데 start with문이 없다는 것 뿐입니다. 즉, 이미 생성 당시 시작할 시퀀스의 값이 정해졌기 때문입니다. 삭제는 drop sequence sequence_name 을 하 면 됩니다. 이제 기본적인 INSERT 문의 사용법을 알았습니다. 상당히 간단하죠? 이제 SELECT 문과 합쳐진 INSERT 문을 실습해보도록 하겠습니다. 먼저 테이블을 하나 생성합니다. SQL> CREATE TABLE TEMP 2 (EMPNO NUMBER(4) PRIMARY KEY, 3 ENAME VARCHAR2(10), 4 JOB VARCHAR2(9), 5 MGR NUMBER(4), 6 HIREDATE DATE, 7 SAL NUMBER(7,2), 8 COMM NUMBER(7,2), 9 DEPTNO NUMBER(2)); 테이블이 생성되었습니다. SQL> INSERT INTO TEMP 2 SELECT * FROM EMP 3 WHERE DEPTNO = 20; 5 개의 행이 만들어졌습니다. SQL> SELECT * FROM TEMP; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 80/12/17 800 20 7566 JONES MANAGER 7839 81/04/02 2975 20 7788 SCOTT ANALYST 7566 87/04/19 3000 20 7876 ADAMS CLERK 7788 87/05/23 1100 20 7902 FORD ANALYST 7566 81/12/03 3000 20 SQL> -- 이런 방법도 있지용~ SQL> CREATE TABLE TEMP2 2 AS 3 SELECT * FROM EMP 4 WHERE DEPTNO = 10; 테이블이 생성되었습니다. SQL> SELECT * FROM TEMP2; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------- ---------- ---------- ---------- 7782 CLARK MANAGER 7839 81/06/09 2450 10 7839 KING PRESIDENT 81/11/17 5000 10 7934 MILLER CLERK 7782 82/01/23 1300 10 1111 MILLER CLE%RK 7782 82/01/23 1300 10 이렇게 SELECT 문을 이용해서도 INSERT를 할 수 있습니다. 좀더 복잡한 쿼리문을 써서도 삽입 을 할 수 있겠지요. }}} ==== UPDATE ==== {{{#!geshi sql UPDATE는 원래의 뜻과 같이 변경된 값을 적용하는 것을 의미합니다. UPDATE는 INSERT의 개념 을 가지고 있습니다. 여러분이 연필로 노트에 적고 고칠때는 어떻게 하나요? 지우개로 지운고 그 다음에 다시 변경된 사항을 적어 넣습니다. 일반적인 UPDATE 문법은 다음과 같습니다. UPDATE TABLE_NAME SET COLUMN_NAME = VALUE WHERE CONDITION... 실습을 통해서 익혀보도록 하겠습니다. SQL> UPDATE TEMP 2 SET SAL = 1000 3 WHERE EMPNO = 7369; 1 행이 갱신되었습니다. SQL> SELECT EMPNO, SAL FROM TEMP 2 WHERE EMPNO = 7369; EMPNO SAL ---------- ---------- 7369 1000 SQL> -- 만약 SAL(월급)에서 세금(월급의 10%)을 제외한 실수령액으로 변경한다면? SQL> UPDATE TEMP 2 SET SAL = SAL - (SAL*0.1); 5 행이 갱신되었습니다. SQL> SELECT EMPNO, SAL FROM TEMP; EMPNO SAL ---------- ---------- 7369 900 7566 2677.5 7788 2700 7876 990 7902 2700 SQL> COMMIT; 커밋이 완료되었습니다. UPDATE의 기본적인 사용은 이렇습니다. 이번에는 쿼리를 이용한 약간은 복잡한 UPDATE문을 보 도록 하겠습니다. SQL> SELECT EMPNO, SAL FROM TEMP; EMPNO SAL ---------- ---------- 7369 900 7566 2677.5 7788 2700 7876 990 7902 2700 SQL> SELECT AVG(SAL) FROM EMP; AVG(SAL) ---------- 2021.66667 SQL> -- EMP에서 사원의 평균월급보다 적은 TEMP 테이블의 SAL을 평균으로 고친다. SQL> UPDATE TEMP 2 SET SAL = (SELECT AVG(SAL) FROM EMP) 3 WHERE SAL < (SELECT AVG(EMP.SAL) 4 FROM EMP, TEMP 5 WHERE EMP.EMPNO = TEMP.EMPNO); 2 행이 갱신되었습니다. SQL> SELECT EMPNO, SAL FROM TEMP; EMPNO SAL ---------- ---------- 7369 2021.67 -- 갱신된 행 7566 2677.5 7788 2700 7876 2021.67 -- 갱신된 행 7902 2700 SQL> COMMIT; 커밋이 완료되었습니다. }}} ==== DELETE ==== {{{#!geshi sql DELETE는 테이블의 데이타 행을 삭제하는 것입니다. 필자는 DROP과 DELETE가 처음에 무진장 헤깔렸습니다. DROP은 객체(테이블, 인덱스, 시퀀스등)를 삭제하는 것이고, DELETE는 데이타 의 행을 삭제하는 것입니다. 혼동하지 마시길 바랍니다. 역시 실습을 통해서 알아보도록 하겠 습니다. DELETE table_name WHERE condition SQL> -- 모든 데이타행의 삭제 SQL> DELETE TEMP; 5 행이 삭제되었습니다. SQL> SELECT COUNT(*) FROM TEMP; COUNT(*) ---------- 0 SQL> ROLLBACK; 롤백이 완료되었습니다. SQL> SELECT COUNT(*) FROM TEMP; COUNT(*) ---------- 5 SQL> -- EMPNO 가 7788 인 사원을 삭제 SQL> DELETE TEMP 2 WHERE EMPNO = 7788; 1 행이 삭제되었습니다. SQL> COMMIT; 커밋이 완료되었습니다. SQL> -- 입사일이 80년에서 81년 사이인 사원을 삭제 SQL> DELETE TEMP 2 WHERE HIREDATE BETWEEN '80/01/01' AND '81/12/31'; 3 행이 삭제되었습니다. SQL> COMMIT; 커밋이 완료되었습니다. SQL> SELECT * FROM TEMP; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------- ---------- ---------- ---------- 7876 ADAMS CLERK 7788 87/05/23 2021.67 20 }}}