Insert (P9-2)
- // 부서테이블에 새로운 데이터 추가
- SQL> INSERT INTO dept
2 VALUES (50, 'Local Branck', 'Korea'); - 1 row created.
- // 추가된 데이터 확인
- SQL> SELECT * FROM dept;
- 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 출력
- SQL> show user;
USER is "SCOTT"
SQL> SELECT USER, SYSDATE from DUAL; // dual -> select절에서 from을 사용해야 하므로 그냥 써주는 거~(특정 테이블에서 select하는 구문이 아니기 때문)- USER SYSDATE
------------------------------ --------
SCOTT 08/10/31
- SYSDATE를 이용한 데이터 추가
- SQL> INSERT INTO emp(empno, ename, hiredate)
2 VALUES(9000, 'Bit', SYSDATE); - 1 row created.
- SQL> SELECT empno, ename, hiredate FROM emp;
- 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 - 15 rows selected.
- ROWID 출력
- SQL> SELECT rowid, empno, ename
2 FROM emp; - 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 - 15 rows selected.
- SELECT 결과를 가지고 INSERT 구문 수행 (P9-6)
- // SELECT 결과를 가지고 테이블 생성
- // WHERE 1=0; -> 테이블 구조만 생성하고 데이터 INSERT는 안함
- SQL> CREATE TABLE emp_history
2 AS
3 SELECT empno, ename, sal, sysdate as d
4 FROM emp
5 WHERE 1=0; - Table created.
- // SELECT 결과를 가지고 INSERT 구문 수행
- SQL> INSERT INTO emp_history
2 SELECT empno, ename, sal, sysdate
3 FROM emp; - 15 rows created.
- 데이터마이닝
원래 몰랐던 사실을 알아내는 것, 통계를 이용함
예 : 신생아 용품을 사는 사람이 맥주도 사간다, 신생아 때문에 외출을 못해서~ => 신생아 용품 옆에 맥주를 갖다 놓는다
- 데이터웨어하우스
사용자의 의사 결정에 도움을 주기 위하여, 다양한 운영 시스템에서 추출, 변환, 통합되고 요약된 데이터베이스
조회용으로 많이 쓰임
갱신은 많이 안 일어남
- OLTP
온라인으로 계속 트랜잭션이 일어나는 데이터베이스
온라인으로 연결되서 계속 처리되는 데이터베이스
갱신이 많이 일어남
Update (P9-8)
- Update 할 때 WHERE절을 안주면 해당 테이블의 데이터 모두 변경됨
- 여러 컬럼을 변경하고자 할 때는 SET절에 ',' 로 구분해서 처리
- SMITH의 부서번호를 10번으로 변경
- SQL> UPDATE emp
2 SET deptno=10
3 WHERE ename='SMITH'; - 1 row updated.
- SQL> select deptno from emp where ename = 'SMITH';
- DEPTNO
----------
10
- Update절에 서브쿼리 사용(P9-9)
- Update절 다음에 테이블명 적을곳에 서브쿼리를 사용하면 가상의 테이블 생성됨.
- 가상의 테이블을 이용해서 Update를 하지만 실제 테이블에 적용됨.
- SQL> SELECT sal
2 FROM emp
3 WHERE deptno=10; - SAL
----------
800
2450
5000
1300 - SQL> UPDATE (SELECT * FROM emp WHERE deptno=10)
2 SET sal = sal*1.1; - 4 rows updated.
- SQL> SELECT sal
2 FROM emp
3 WHERE deptno=10; - SAL
----------
880
2695
5500
1430
- 사번이 7788인 사원의 부서명은 'ACCOUNTING'로 변경, 봉급은 사원중 가장 많은 봉급을 받는 사람이랑 동일하게 변경
- SQL> SELECT deptno, sal FROM emp WHERE empno=7788;
- DEPTNO SAL
---------- ----------
20 3000 - 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; - 1 row updated.
- SQL> SELECT deptno, sal FROM emp WHERE empno=7788;
- DEPTNO SAL
---------- ----------
10 5500
- SCOTT의 부서번호를 SMITH의 부서번호로~
- SQL> UPDATE emp
2 SET deptno = (SELECT deptno FROM dept WHERE ename = 'SMITH')
3 WHERE ename = 'SCOTT'; - 1 row updated.
- SQL> SELECT ename, deptno
2 from emp; - 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 - 15 rows selected.
Merge (P9-11)
- MERGE는 UPDATE와 INSERT를 결합한 문장이다.
- 백업 테이블인 기존 데이터 테이블과 계속 사용중인 데이터 테이블이 있을 때 기존 데이터에 계속 사용중인 데이터 추가 -> 기존 자료는 신규 자료로 업데이트 하고 기존에 없고 신규로 있는 자료는 추가
- 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); - 15 rows merged.
Delete (P9-13)
- WHERE절을 안주면 해당 테이블에 있는 레코드가 전부 삭제됨.(ROLLBACK으로 복구할 수는 있음)
- 고용일이 1980년 이전인 사원 삭제
- SQL> DELETE FROM emp
2 WHERE hiredate < TO_DATE('1980,01,01', 'YYYY,MM,DD'); - 0 rows deleted.
- dept.deptno를 참조하는 곳이 있기 때문에 삭제가 안됨.
- 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 - // emp 테이블에서 deptno를 참조하고 있음~
- SQL> SELECT empno, ename, deptno
2 FROM emp
3 WHERE deptno=10; - EMPNO ENAME DEPTNO
---------- ---------- ----------
7782 CLARK 10
7839 KING 10
7934 MILLER 10
Returning Clause (P9-16)
- INSERT, UPDATE, DELETE 수행에 대한 레코드 변수를 받을 수 있음.
- 변수 사용 방법
선언 방법 - VARIABLE 변수명 변수타입
사용 방법 - :변수명 (컬럼이랑 구분하기 위해 콜론을 붙혀줌)
출력 방법 - PRINT 변수명
- 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; - 1 row created.
- SQL> PRINT a
- A
----------
100 - SQL> PRINT b
- B
--------------------------------
X - SQL> PRINT c
- C
----------
2
Data Types (P9-17)
- CHAR vs VARCHAR2
- CHAR은 고정길이 VARCHAR2는 가변길이
- 둘다 크기를 2로 설정하고 문자 한개('x')를 입력하면 CHAR는 문자+공백으로 크기 2를 모두 사용함을 알 수 있다.
- SQL> CREATE TABLE test(
2 a CHAR(2)
3 ,b VARCHAR2(2)
4 ); - Table created.
- SQL> INSERT INTO test VALUES('x', 'x');
- 1 row created.
- SQL> SELECT a||'test', b||'test'
2 FROM test; - A||'TE B||'TE
------ ------
x test xtest
이 글은 스프링노트에서 작성되었습니다.