ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 250820
    SQL 2020. 8. 25. 12:24
    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를 출력

     

     

    'SQL' 카테고리의 다른 글

    280820  (2) 2020.08.28
    270820  (2) 2020.08.27
    270820 - 쪽지 시험  (0) 2020.08.27
    260820  (3) 2020.08.26
    240820  (1) 2020.08.25

    댓글

Designed by Tistory.