Insert (P9-2)

  1. // 부서테이블에 새로운 데이터 추가
  2. SQL> INSERT INTO dept
      2  VALUES (50, 'Local Branck', 'Korea');
  3. 1 row created.
  4.  
  5. // 추가된 데이터 확인
  6. SQL> SELECT * FROM dept;
  7.  
  8.     DEPTNO DNAME          LOC
    ---------- -------------- -------------
            10 ACCOUNTING     NEW YORK
            20 RESEARCH       DALLAS
            30 SALES          CHICAGO
            40 OPERATIONS     BOSTON
            50 Local Branck   Korea

 

  • 특정 컬럼에만 값을 주고 나머지는 null 값으로 처리하고 싶은 경우 (P-4)

// 데이터를 추가할 컬럼명을 지정해줌

INSERT INTO dept(deptno, dname) VALUES (60, 'HQs');

 

// 나머지를 NULL로 처리~

INSERT INTO dept VALUES(60, 'HQs', NULL);

 

  • pseudocolumns and function(P9-5)

USER : 현재 로그인한 사용자 (function)

SYSDATE : 현재의 날짜, 시간 (function)

ROWID : 레코드의 물리적인 저장위치에 대한 정보를 가지고 있음(pseudocolumns -> rownum 같은 것~)

 

  • USER, SYSDATE 출력
  1. SQL> show user;
    USER is "SCOTT"

  2. SQL> SELECT USER, SYSDATE from DUAL;   // dual -> select절에서 from을 사용해야 하므로 그냥 써주는 거~(특정 테이블에서 select하는 구문이 아니기 때문)
  3. USER                           SYSDATE
    ------------------------------ --------
    SCOTT                          08/10/31

 

  • SYSDATE를 이용한 데이터 추가
  1. SQL> INSERT INTO emp(empno, ename, hiredate)
      2  VALUES(9000, 'Bit', SYSDATE);
  2. 1 row created.
  3.  
  4. SQL> SELECT empno, ename, hiredate FROM emp;
  5.  
  6.      EMPNO ENAME      HIREDATE
    ---------- ---------- --------
          7369 SMITH      80/12/17
          7499 ALLEN      81/02/20
          7521 WARD       81/02/22
          7566 JONES      81/04/02
          7654 MARTIN     81/09/28
          7698 BLAKE      81/05/01
          7782 CLARK      81/06/09
          7788 SCOTT      87/04/19
          7839 KING       81/11/17
          7844 TURNER     81/09/08
          7876 ADAMS      87/05/23
          7900 JAMES      81/12/03
          7902 FORD       81/12/03
          7934 MILLER     82/01/23
          9000 Bit        08/10/31
  7. 15 rows selected.

 

  • ROWID 출력
  1. SQL> SELECT rowid, empno, ename
      2  FROM emp;
  2.  
  3. ROWID                   EMPNO ENAME
    ------------------ ---------- ----------
    AAAL+ZAAEAAAAAdAAA       7369 SMITH
    AAAL+ZAAEAAAAAdAAB       7499 ALLEN
    AAAL+ZAAEAAAAAdAAC       7521 WARD
    AAAL+ZAAEAAAAAdAAD       7566 JONES
    AAAL+ZAAEAAAAAdAAE       7654 MARTIN
    AAAL+ZAAEAAAAAdAAF       7698 BLAKE
    AAAL+ZAAEAAAAAdAAG       7782 CLARK
    AAAL+ZAAEAAAAAdAAH       7788 SCOTT
    AAAL+ZAAEAAAAAdAAI       7839 KING
    AAAL+ZAAEAAAAAdAAJ       7844 TURNER
    AAAL+ZAAEAAAAAdAAK       7876 ADAMS
    AAAL+ZAAEAAAAAdAAL       7900 JAMES
    AAAL+ZAAEAAAAAdAAM       7902 FORD
    AAAL+ZAAEAAAAAdAAN       7934 MILLER
    AAAL+ZAAEAAAAAfAAA       9000 Bit
  4. 15 rows selected.

 

  • SELECT 결과를 가지고 INSERT 구문 수행 (P9-6)
  1. // SELECT 결과를 가지고 테이블 생성
  2. // WHERE 1=0; -> 테이블 구조만 생성하고 데이터 INSERT는 안함
  3. SQL> CREATE TABLE emp_history
      2  AS
      3  SELECT empno, ename, sal, sysdate as d
      4  FROM emp
      5  WHERE 1=0;
  4. Table created.
  5.  
  6. // SELECT 결과를 가지고 INSERT 구문 수행
  7. SQL> INSERT INTO emp_history
      2  SELECT empno, ename, sal, sysdate
      3  FROM emp;
  8. 15 rows created.

 

 

  • 데이터마이닝

원래 몰랐던 사실을 알아내는 것, 통계를 이용함

예 : 신생아 용품을 사는 사람이 맥주도 사간다, 신생아 때문에 외출을 못해서~ => 신생아 용품 옆에 맥주를 갖다 놓는다

 

  • 데이터웨어하우스

사용자의 의사 결정에 도움을 주기 위하여, 다양한 운영 시스템에서 추출, 변환, 통합되고 요약된 데이터베이스

조회용으로 많이 쓰임

갱신은 많이 안 일어남

 

  • OLTP

온라인으로 계속 트랜잭션이 일어나는 데이터베이스

온라인으로 연결되서 계속 처리되는 데이터베이스

갱신이 많이 일어남

 

 

Update (P9-8)

  • Update 할 때 WHERE절을 안주면 해당 테이블의 데이터 모두 변경됨
  • 여러 컬럼을 변경하고자 할 때는 SET절에 ',' 로 구분해서 처리

 

  • SMITH의 부서번호를 10번으로 변경
  1. SQL> UPDATE emp
      2  SET deptno=10
      3  WHERE ename='SMITH';
  2. 1 row updated.
  3.  
  4. SQL> select deptno from emp where ename = 'SMITH';
  5.     DEPTNO
    ----------
            10

 

  • Update절에 서브쿼리 사용(P9-9)
  • Update절 다음에 테이블명 적을곳에 서브쿼리를 사용하면 가상의 테이블 생성됨.
  • 가상의 테이블을 이용해서 Update를 하지만 실제 테이블에 적용됨.
  1. SQL> SELECT sal
      2  FROM emp
      3  WHERE deptno=10;
  2.  
  3.        SAL
    ----------
           800
          2450
          5000
          1300
  4.  
  5. SQL> UPDATE (SELECT * FROM emp WHERE deptno=10)
      2  SET sal = sal*1.1;
  6. 4 rows updated.
  7.  
  8. SQL> SELECT sal
      2  FROM emp
      3  WHERE deptno=10;
  9.  
  10.        SAL
    ----------
           880
          2695
          5500
          1430

 

  • 사번이 7788인 사원의 부서명은 'ACCOUNTING'로 변경, 봉급은 사원중 가장 많은 봉급을 받는 사람이랑 동일하게 변경
  1. SQL> SELECT deptno, sal FROM emp WHERE empno=7788;
  2.     DEPTNO        SAL
    ---------- ----------
            20       3000
  3.  
  4. SQL> UPDATE emp
      2  SET deptno = (SELECT deptno FROM dept
      3               WHERE dname='ACCOUNTING'),
      4       sal = (SELECT MAX(sal) FROm emp)
      5  WHERE empno = 7788;
  5. 1 row updated.
  6.  
  7. SQL> SELECT deptno, sal FROM emp WHERE empno=7788;
  8.  
  9.     DEPTNO        SAL
    ---------- ----------
            10       5500

 

  • SCOTT의 부서번호를 SMITH의 부서번호로~
  1. SQL> UPDATE emp
      2  SET deptno = (SELECT deptno FROM dept WHERE ename = 'SMITH')
      3  WHERE ename = 'SCOTT';
  2. 1 row updated.
  3.  
  4. SQL> SELECT ename, deptno
      2  from emp;
  5.  
  6. ENAME          DEPTNO
    ---------- ----------
    SMITH              20
    ALLEN              30
    WARD               30
    JONES              20
    MARTIN             30
    BLAKE              30
    CLARK              10
    SCOTT
    KING               10
    TURNER             30
    ADAMS              20
    JAMES              30
    FORD               20
    MILLER             10
    Bit
  7. 15 rows selected.

 

 

Merge (P9-11)

  • MERGE는 UPDATE와 INSERT를 결합한 문장이다.
  • 백업 테이블인 기존 데이터 테이블과 계속 사용중인 데이터 테이블이 있을 때 기존 데이터에 계속 사용중인 데이터 추가 -> 기존 자료는 신규 자료로 업데이트 하고 기존에 없고 신규로 있는 자료는 추가 
  1. SQL> MERGE INTO emp_history eh
      2  USING emp e
      3  ON (e.empno = eh.empno)      // Join 조건
      4  WHEN MATCHED THEN            // 신규데이터로 업데이트
      5  UPDATE SET eh.sal = e.sal
      6  WHEN NOT MATCHED THEN        // 신규데이터로 추가
      7  INSERT VALUES (e.empno, e.ename, e.sal, sysdate);
  2.  
  3. 15 rows merged.

 

 

Delete (P9-13)

  • WHERE절을 안주면 해당 테이블에 있는 레코드가 전부 삭제됨.(ROLLBACK으로 복구할 수는 있음)
  • 고용일이 1980년 이전인 사원 삭제
  1. SQL> DELETE FROM emp
      2  WHERE hiredate < TO_DATE('1980,01,01', 'YYYY,MM,DD');
  2.  
  3. 0 rows deleted.

 

  • dept.deptno를 참조하는 곳이 있기 때문에 삭제가 안됨.
  1. SQL> DELETE FROM dept WHERE deptno=10;
    DELETE FROM dept WHERE deptno=10
    *
    ERROR at line 1:
    ORA-02292: integrity constraint (SCOTT.FK_DEPTNO) violated - child record found
  2.  
  3. // emp 테이블에서 deptno를 참조하고 있음~
  4. SQL> SELECT empno, ename, deptno
      2  FROM emp
      3  WHERE deptno=10;
  5.  
  6.      EMPNO ENAME          DEPTNO
    ---------- ---------- ----------
          7782 CLARK              10
          7839 KING               10
          7934 MILLER             10

 

 

Returning Clause (P9-16)

  • INSERT, UPDATE, DELETE 수행에 대한 레코드 변수를 받을 수 있음.
  • 변수 사용 방법

선언 방법 - VARIABLE 변수명 변수타입

사용 방법 - :변수명 (컬럼이랑 구분하기 위해 콜론을 붙혀줌)

출력 방법 - PRINT 변수명

 

  1. SQL> VARIABLE a NUMBER
    SQL> VARIABLE b CHAR
    SQL> VARIABLE c NUMBER
    SQL>
    SQL> INSERT INTO s_dept VALUES(100, 'X', 2)
      2  RETURNING id, name, region_id INTO :a, :b, :c;
  2. 1 row created.
  3.  
  4. SQL> PRINT a
  5.          A
    ----------
           100
  6.  
  7. SQL> PRINT b
  8. B
    --------------------------------
    X
  9.  
  10. SQL> PRINT c
  11.          C
    ----------
             2

 

 

Data Types (P9-17)

  • CHAR vs VARCHAR2
  • CHAR은 고정길이 VARCHAR2는 가변길이
  • 둘다 크기를 2로 설정하고 문자 한개('x')를 입력하면 CHAR는 문자+공백으로 크기 2를 모두 사용함을 알 수 있다.
  1. SQL> CREATE TABLE test(
      2     a CHAR(2)
      3    ,b VARCHAR2(2)
      4  );
  2. Table created.
  3.  
  4. SQL> INSERT INTO test VALUES('x', 'x');
  5. 1 row created.
  6.  
  7. SQL> SELECT a||'test', b||'test'
      2  FROM test;
  8. A||'TE B||'TE
    ------ ------
    x test xtest

이 글은 스프링노트에서 작성되었습니다.

Posted by Gungume
,