-
insert into emp (empno) values (9999) ;
첫 INSERT.
insert into 테이블 명 (넣을 column)
values ( 넣을 값)
;
insert into emp values (9998, 'STOUY', 'VICEPRE', '9999', SYSDATE, 1500, 1000, 20) ; -- 같은 사번으로 넣을 수가 없다.
같은 사번, 9999로 넣으면 오류
ROLLBACK; --COMMIT 되었던 마지막 지점까지 되돌리기 왜 하는걸까?????
롤백은왜? 저장 안하려고 하는 거지 뭐.
UPDATE EMP SET JOB = 'SALESMAN', SAL=1600 WHERE EMPNO=9998 --여긴 유일한 값을 넣는게 좋을 것 같네요 ;
유일한 값 안넣었을 때의 오류?
존재하는 지 확인 해봐야겠다.
UPDATE EMP SET SAL=SAL+150 WHERE JOB='MANAGER' ;
정보의 수정을 위한 update
update (table)
set (column's change)
where (condition)
;
--SALES, ACCOUNTING 부서원의 월급을 10프로 인상해라 > UPDATE EMP SET SAL = SAL*1.1 --월급 10프로 인상 WHERE DEPTNO IN (--(20, 30) --부서 번호가 20또는 30인사람 SELECT DEPTNO FROM DEPT WHERE DNAME IN ('SALES', 'ACCOUNTING') ); --TABLE 자체가 다른 곳에 있을 때 굳이 JOIN을 하지 않고 쓰기 위한 방법! (AKA 서브쿼리) --보고싶은거 블록해서 CTRL+ENT 눌러도 화면 출력 가능하다.
첫 서브쿼리 - where 안에 쿼리가 하나 더 들어가네.
update (table)
set (column's change)
where (column) in (
select (column)
from (table)
where (column) in (condition)
) ;
-- 'SALES' 'ACCOUNTING' 부서원의 사원정보를 나타내라 > SELECT * FROM EMP WHERE DEPTNO IN( SELECT DEPTNO FROM DEPT WHERE DNAME IN ('SALES', 'ACCOUNTING') );
두 번째 서브쿼리
--sal-grade 1,2인 사원 월급 10프로 인상 UPDATE EMP SET SAL = SAL *1.1 WHERE SAL BETWEEN ( SELECT LOSAL FROM SALGRADE WHERE GRADE = 1 ) AND ( SELECT HISAL FROM SALGRADE WHERE GRADE = 2 );
세 번째 서브쿼리
CREATE TABLE EMP_HIRE AS SELECT EMPNO, ENAME, HIREDATE FROM EMP WHERE 1=0 ; --1=0을 만족하는 행이 없으므로, 빈 테이블 생성, EMPNO, ENAME, HIREDATE라는 칼럼은 생성이 되나, 비어있다. CREATE TABLE EMP_SAL AS SELECT EMPNO, ENAME, SAL FROM EMP WHERE 1=0 ;
CREATE (table)
as select (columns)
from (table)
where (condition)
INSERT ALL -- 여기선 왜 ALL을 쓰지? WHEN HIREDATE > '2010/01/01' --조건 THEN INTO EMP_HIRE -- INSERT니까 어디에 넣을 껀지 입력 VALUES (EMPNO, ENAME, HIREDATE) -- 어떤 것들을 넣을 껀지 입력 WHEN SAL>=2000 THEN INTO EMP_SAL VALUES(EMPNO, ENAME, SAL) SELECT EMPNO, ENAME, HIREDATE, SAL FROM EMP ;
생성된 테이블에 INSERT
insert ( )
when (condition)
then into (table)
values (columns)
when (condition)
then into (table)
values (columns)
select (columns) -- 위에 넣게되는 columns를 모두 포함하고 있어야해
from (table)
;
CREATE TABLE EMP_MERGE_EX AS SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP WHERE DEPTNO IN(10, 20) ; MERGE INTO EMP_MERGE_EX M USING( SELECT EMPNO, ENAME, DEPTNO, SAL FROM EMP WHERE DEPTNO IN(20, 30) ) E ON (M.EMPNO = E.EMPNO) WHEN MATCHED THEN UPDATE SET M.SAL = ROUND(M.SAL * 1.1) WHEN NOT MATCHED THEN INSERT(M.EMPNO, M.ENAME, M.SAL, M.DEPTNO) VALUES(E.EMPNO, E.ENAME, E.SAL, E.DEPTNO) WHERE E.SAL > 1000 ;
MERGE **
TCL - Transaction
Transaction ?
- 데이터를 처리하는 하나의 단위 ( 세미 콜론' ; '으로 구분)
- 하나의 논리적인 작업 단위로써 성공하거나 실패하는 일련의 SQL문
- 데이터를 변경하는 DML문장으로 구성된다.
- 시작 : DML 실행 시
- 종료 : COMMIT or ROLLBACK 수행 시 / DDL or DCL 문장 실행 시 / 기계 장애 or 시스템 충돌 시 / DEADLOCK 발생 시 / 사용자의 정상 종료 시
- 자동 COMMIT 발생 상황 : DDL, DCL 문장의 완료 시 / SQL*PLUS의 정상 종료 시
- 자동 ROLLBACK 발생 상황 : SQL*PLUS의 비정상 종료 시 / 시스템의 비정상적인 종료 시
COMMIT: TRANSACTION을 DB에 반영한다.
ROLLBACK: TRANSACTION을 DB에 반영하지 않는다.
SAVEPOINT:
그러므로, COMMIT 이전에는 복구가 가능하다. 그리고 SELECT문을 이용하여 작성자는 변경사항을 미리 확인 가능하지만, 다른 사용자들은 열람이 불가하다. 변경된 행은 LOCK이 설정되어 있는 상태로, 다른 사용자는 변경할 수 없는 상태가 된다. 이것으로 DB는 데이터의 일관성을 제공한다.
COMMIT 이후에는 영구적으로 반영되며 이전 자료는 완전히 삭제된다. 그리고 LOCK이 해제된다.
변환 함수
숫자; 문자; 날짜 데이터타입으로 변환하는 함수
NUMBER > VARCHAR2 > DATE
TO_CHAR : 날짜형, 숫자형을 문자형으로 형 변환
TO_DATE : 문자형을 날짜형으로 형 변환
TO_NUMBER : 문자형을 숫자형으로 형 변환
9 : 일반적인 숫자
0 : 앞의 빈자리를 0으로 채움
$ : $ 표시
L : 지역 통화 단위
. : 소수점을 표시
, : 천 단위를 표시
기타 함수
NVL (A, B) : 주어진 A이 NULL일 경우 B로 치환
NVL2 (A, B, C) : A가 NULL이 아닐 경우 B를, NULL이면 C로 치환
NULLIF (A, B) : A, B가 동일하면 NULL, 다를 경우 A를 반환
DECODE (A, B, C) : A와 B가 같으면 C를 출력