INSERT
- INSERT INTO TABLE명 [칼럼] VALUES (값...)
- 테이블 열 목록을 사용하지 않는다면 VALUES에 순서에 따라 모든 값을 나열해야한다.
- 칼럼은 테이블의 순서와 같을 필요가 없다.
- 서브쿼리와 함께 사용이 가능하다. 단 INSERT절의 열의 수와 서브쿼리의 열의 수가 일치해야한다.
- NSERT INTO TABLE[] SUBQUERY;
Q1) EMP테이블을 TEST테이블로 가져온다
CREATE TABLE TEST AS SELECT * FROM EMP;
Q2) 특정행을 삽입해보자
SQL> INSERT INTO TEST(EMPNO,ENAME,HIREDATE) VALUES(7233,'PAUL',SYSDATE);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- -------------------- ------------------ ----- -------- ----- ----- ------
7233 PAUL 21/05/26
Q3) 사원의 번호, 사용자 이름, 봉급을 입력해보자
SQL> INSERT INTO TEST(EMPNO,ENAME,SAL) VALUES(7234,USER,3400);
7234 SCOTT 3400
Q4) 날짜 값을 입력해보자
SQL> INSERT INTO TEST(EMPNO,ENAME,HIREDATE) VALUES(7533,'FUCK',TO_DATE('1997-02-05','YYYY-MM-
DD'));
SQL> INSERT INTO TEST(EMPNO,ENAME,HIREDATE) VALUES(7533,'FUCK2','1997/02/09');
7533 FUCK 97/02/05
7533 FUCK2 97/02/09
Q5) EMP 테이블 사원 중에 A가 들어있는 사원의 정보만 NEW_EMP 테이블에 삽입하라
서브쿼리를 사용하여라
SQL> CREATE TABLE NEW_EMP(
2 ID NUMBER(4),
3 NAME VARCHAR2(10));
SQL> INSERT INTO NEW_EMP
2 SELECT EMPNO,ENAME
3 FROM EMP
4 WHERE ENAME LIKE '%A%';
6 rows created.
SQL> SELECT * FROM NEW_EMP;
ID NAME
----- --------------------
7499 ALLEN
7521 WARD
7654 MARTIN
7698 BLAKE
7782 CLARK
7900 JAMES
UPDATE
- 특정 열의 값을 변경할 수 있다
- WHERE절을 생략하면 테이블의 모든 행이 수행된다
- UPDATE TABLE명 / SET COLUMN = VALUES[...] // WHERE
- ROLLBACK을 통해 UPDATE전의 상태로 돌아간다.
Q1) TEST 테이블의 COMM값을 0으로 만들자
SQL> UPDATE TEST SET COMM = 0;
16 rows updated.
SQL> SELECT COMM FROM TEST;
COMM
-----
0
0
0
0
0
0
Q2) ROLLBACK을 통해 이전 상태로 되돌리자
SQL> ROLLBACK;
Rollback complete.
SQL> SELECT COMM FROM TEST;
COMM
-----
300
500
1400
Q3) TEST테이블에서 FORD의 COMM을 500으로 변경하자
SQL> UPDATE TEST
2 SET COMM = 500
3 WHERE ENAME = 'FORD';
1 row updated.
SQL> SELECT * FROM TEST WHERE ENAME = 'FORD';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- -------------------- ------------------ ----- -------- ----- ----- ------
7902 FORD ANALYST 7566 81/12/03 3000 500 20
Q4) TEST 테이블에서 PAUL의 직업은 CLERK로 봉급은 5000, 커미션은 봉급의 20%로 변경해보자
SQL> UPDATE TEST
2 SET SAL = 5000, JOB = 'CLERK', COMM = SAL*0.2
3 WHERE ENAME = 'PAUL';
1 row updated.
SQL> SELECT * FROM TEST WHERE ENAME = 'PAUL';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- -------------------- ------------------ ----- -------- ----- ----- ------
7233 PAUL CLERK 21/05/26 5000
# COMM값은 NULL*0.2가 되어 NULL값이 입력된다. 이후 한번 더 COMM값에 대해 작업을 수행하면 COMM값에 정상적으로 값이 들어가는 것을 확인할 수 있다.
Q5) 서브쿼리를 이용해서 사원의 번호가 7902 사원의 부서번호를 KING와 동일하게 변경해주자
SQL> UPDATE TEST
2 SET DEPTNO = (SELECT DEPTNO FROM TEST WHERE ENAME = 'KING') WHERE EMPNO=7902;
SQL> SELECT * FROM TEST WHERE DEPTNO = 10;
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
7902 FORD ANALYST 7566 81/12/03 3000 500 10
7934 MILLER CLERK 7782 82/01/23 1300 10
Q6) 7698사원의 직업과 부서번호를 7499사원의 직업과 부서번호와 같도록 수정하자(그룹핑)
SQL> UPDATE TEST
2 SET (JOB,DEPTNO) = (SELECT JOB,DEPTNO FROM TEST WHERE EMPNO = 7499)
3 WHERE EMPNO = 7698;
SQL> SELECT * FROM TEST WHERE EMPNO = 7499 OR EMPNO = 7698;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- -------------------- ------------------ ----- -------- ----- ----- ------
7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30
7698 BLAKE SALESMAN 7839 81/05/01 2850 30
DELETE
- DELETE FROM [테이블명] WHERE [조건]
Q1) 전체 레코드를 삭제하라(ROLLBACK)
SQL> DELETE FROM TEST;
16 rows deleted.
SQL> SELECT * FROM TEST;
no rows selected
SQL> ROLLBACK;
Rollback complete.
Q2) 일부 레코드를 삭제해보자
SQL> DELETE FROM TEST
2 WHERE EMPNO = 7533;
SQL> SELECT * FROM TEST;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- -------------------- ------------------ ----- -------- ----- ----- ------
7369 SMITH CLERK 7902 80/12/17 800 20
7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30
7521 WARD SALESMAN 7698 81/02/22 1250 500 30
7566 JONES MANAGER 7839 81/04/02 2975 20
7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30
7698 BLAKE MANAGER 7839 81/05/01 2850 30
7782 CLARK MANAGER 7839 81/06/09 2450 10
7839 KING PRESIDENT 81/11/17 5000 10
7844 TURNER SALESMAN 7698 81/09/08 1500 0 30
7900 JAMES CLERK 7698 81/12/03 950 30
7902 FORD ANALYST 7566 81/12/03 3000 20
7934 MILLER CLERK 7782 82/01/23 1300 10
7233 PAUL 21/05/26
7234 SCOTT 3400
Q4) 사원의 봉급 중 2000 이상 받는 사원을 삭제하자
SQL> DELETE FROM TEST
2 WHERE SAL>2000;
MERGE
- INSERT + UPDATE
- 단일문에서 여러 DML을 수행할 떄 사용한다
MERGE INTO TABLE명
USING [변경 또는 추가할 데이터의 원본을 지정하는 테이블, VIEW, 서브쿼리]
ON -> 추가조건
WHERE MATCHED TEHN
UPDATE SET
WHERE NOT MATHCED TEHN
INSERT
VALUES
Q1) EMP 테이블에서 TEST테이블과 비교해서 동일한 사원번호 데이터가 있으면
TEST테이블의 봉급, 커미션을 EMP 테이블의 값으로 수정하고
해당 사원번호를 가진 사원이 없으면 TEST테이블에 EMP 테이블의 데이터를 이용해서 입력해보자
SQL> MERGE INTO TEST T
2 USING EMP E
3 ON(T.EMPNO = E.EMPNO)
4 WHEN MATCHED THEN UPDATE SET T.SAL = E.SAL,T.COMM = E.COMM
5 WHEN NOT MATCHED THEN
6 INSERT (EMPNO,ENAME,SAL,COMM) VALUES(E.EMPNO,E.ENAME,E.SAL,E.COMM);
# ON(T.EMPNO = E.EMPNO) 조건이 만족되면 MATCHED, 조건이 만족하지 않을 때 NOT MATCH 수행
다중 테이블 입력
- 무조건 INSERT : ALL 뒤에 여러개의 INTO절을 지정하여 무조건 다중테이블에 데이터 삽입, 서브쿼리에서는 반환된 각 행에 대해 INTO절을 한번씩 수행
- 조건 ALL INSERT / 조건 INSERT : 조건지정, 하나의 다중 INSERT는 WHEN문을 127(2^7 -1)개 까지만 사용할 수 있 다.
- 조건 FIRST INSERT : 나열된 순서대로 WHEN문을 평가 실행
- 피벗 INSERT : 비관계형 테이블의 레코드를 관계형으로 구현할 떄 사용
테이블 생성
SQL> CREATE TABLE TEST01 AS SELECT * FROM EMP WHERE 1 = 0;
Table created.
SQL> CREATE TABLE TEST02 AS SELECT * FROM EMP WHERE 1 = 0;
Table created.
# WHERE 1 = 0; 구조만 가져오고 내용은 가져오지 않는다.
1) 무조건 insert
INSERT ALL
INTO TABLE
INTO TABLE
SELECT
FROM WHERE
Q1) 사원 테이블에서 20번 부서이상의 데이터를 TEST01에는 번호, 입사일, 봉급을 입력하고 TEST02는 사원번호, 매니저
봉급을 입력하라
SQL> INSERT ALL
2 INTO TEST01(EMPNO,HIREDATE,SAL) VALUES(EMPNO,HIREDATE,SAL)
3 INTO TEST02(EMPNO,MGR,SAL) VALUES(EMPNO,MGR,SAL)
4 SELECT EMPNO,MGR,SAL,HIREDATE
5 FROM EMP
6 WHERE DEPTNO > 20;
Q2) 사원 테이블에서 20번 부서이상의 데이터를 TEST01에는 번호, 이름, 입사일을 입력하고 TEST02는 사원번호, 매니저
봉급을 입력하라, 단 봉급이 2000 이상인 경우 TEST01에 넣어라
SQL> INSERT ALL
2 WHEN SAL>=2000 THEN
3 INTO TEST01(EMPNO,HIREDATE,SAL) VALUES(EMPNO,HIREDATE,SAL)
4 ELSE
5 INTO TEST02(EMPNO,MGR,SAL) VALUES(EMPNO,MGR,SAL)
6 SELECT EMPNO,MGR,SAL,HIREDATE
7 FROM EMP
8 WHERE DEPTNO > 20;
INSERT FIRST / INSERT ALL 차이점
SQL> INSERT FIRST
2 WHEN ENAME LIKE ('%A%') THEN
3 INTO TEST02(EMPNO,MGR,SAL) VALUES(EMPNO,MGR,SAL)
4 WHEN ENAME LIKE ('%F%') THEN
5 INTO TEST03(EMPNO,MGR,SAL) VALUES(EMPNO,MGR,SAL)
6 WHEN SAL>=2000 THEN
7 INTO TEST01(EMPNO,HIREDATE,SAL) VALUES(EMPNO,HIREDATE,SAL)
8 SELECT ENAME,EMPNO,MGR,SAL,HIREDATE
9 FROM EMP
10 WHERE DEPTNO > 20;
5 rows created.
SQL> SELECT * FROM TEST01;
no rows selected
SQL> SELECT * FROM TEST02;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- -------------------- ------------------ ----- -------- ----- ----- ------
7499 7698 1600
7521 7698 1250
7654 7698 1250
7698 7839 2850
7900 7698 950
SQL> SELECT * FROM TEST03;
no rows selected
SQL> INSERT ALL
2 WHEN ENAME LIKE ('%A%') THEN
3 INTO TEST02(EMPNO,MGR,SAL) VALUES(EMPNO,MGR,SAL)
4 WHEN ENAME LIKE ('%F%') THEN
5 INTO TEST03(EMPNO,MGR,SAL) VALUES(EMPNO,MGR,SAL)
6 WHEN SAL>=2000 THEN
7 INTO TEST01(EMPNO,HIREDATE,SAL) VALUES(EMPNO,HIREDATE,SAL)
8 SELECT ENAME,EMPNO,MGR,SAL,HIREDATE
9 FROM EMP
10 WHERE DEPTNO > 20;
6 rows created.
SQL> SELECT * FROM TEST01;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- -------------------- ------------------ ----- -------- ----- ----- ------
7698 81/05/01 2850
SQL> SELECT * FROM TEST01;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- -------------------- ------------------ ----- -------- ----- ----- ------
7698 81/05/01 2850
SQL> SELECT * FROM TEST03;
no rows selected
# INSERT FIRST는 WHEN절이 만족할 경우 다음 WHEN절을 스킵한다. 하나의 TRUE 값만 리턴받는다
'IT > DataBase' 카테고리의 다른 글
SQL - VIEW (0) | 2021.05.31 |
---|---|
SQL - 제약조건 (0) | 2021.05.28 |
SQL - SUBQUERY (0) | 2021.05.25 |
SQL - SET (0) | 2021.05.25 |
SQL - JOIN (0) | 2021.05.24 |