본문 바로가기
IT/DataBase

SQL - CRUD

by 천빈 2021. 5. 26.

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