DML, DDL, DCL, TCL, DQL

kxsxh·2024년 2월 27일
0

DataBase

목록 보기
4/5
DML(Data Manuplation Language) : 데이터 조작어 ==> insert, update, delete, merge
                                     : 수동 commit 이므로 rollback 이 가능하다.
                                     
DDL(Data Definition Language) : 데이터 정의어 ==> create, drop, alter, truncate
                                    : 자동 commit( Auto commit) 이므로 rollback 이 불가하다.
                                    
DCL(Data Control Language) : 데이터 제어어 ==> grant, revoke     
                                 : 자동 commit( Auto commit) 이므로 rollback 이 불가하다.
                                 
TCL(Transaction Control Language) : 트랜잭션 제어어 ==> commit, rollback
      
DQL(Data Query Language) : 데이터 질의어 ==> select 
      

데이터 조작어(DML)

  • Data Manuplation Language
DML 문은 기본적으로 수동 commit 이다.
즉, DML 문을 수행한 다음에는 바로 디스크(파일)에 적용되지 않고 commit 해야만 적용된다.
그래서 DML 문을 수행한 다음에 디스크(파일)에 적용치 않고자 한다라면 rollback 하면 된다.
  1. insert --> 데이터 입력
  2. update --> 데이터 수정
  3. delete --> 데이터 삭제
  4. merge --> 데이터 병합
insert 는 문법이
insert into 테이블명(컬럼명1,컬럼명2,...) values(1,2,...); 이다
※ Unconditional insert all  -- ==> 조건이 없는 insert 
    [문법] insert all 
           into 테이블명1(컬럼명1, 컬럼명2, ....)
           values(1,2, .....)
           into 테이블명2(컬럼명3, 컬럼명4, ....)
           values(3,4, .....)
           SUB Query문;

ex)

 insert all 
    into TBL_EMP1(empno, ename, monthsal, gender, manager_id, department_id, department_name)
    values(employee_id, fullname,month_sal,  gender,manager_id,department_id,department_name )
    into TBL_EMP1_BACKUP(empno, ename, monthsal, gender, manager_id, department_id, department_name)
    values(employee_id, fullname,month_sal,  gender,manager_id,department_id,department_name)
   select employee_id
        , first_name || ' ' || last_name AS fullname 
        , nvl(salary + (salary * commission_pct), salary) AS month_sal
        , case when substr(jubun,7,1) in('1','3') then '남' else '여' end AS gender
        , E.manager_id
        , E.department_id
        , department_name
   from employees E LEFT JOIN departments D 
   on E.department_id = D.department_id
   order by E.department_id asc, employee_id asc;

※ Conditional insert all -- ==> 조건이 있는 insert 
조건(where)에 일치하는 행들만 특정 테이블로 찾아가서 insert 하도록 하는 것이다.

ex)

  insert all 
    when department_id = 30 then  -- 컬럼의 값이 30인가..?
    into tbl_emp_dept30(empno, ename, monthsal, gender, manager_id, department_id, department_name)
    values(employee_id, fullname,month_sal,  gender,manager_id,department_id,department_name )
     when department_id = 50 then 
    into  tbl_emp_dept50(empno, ename, monthsal, gender, manager_id, department_id, department_name)
    values(employee_id, fullname,month_sal,  gender,manager_id,department_id,department_name)
     when department_id = 80 then 
    into  tbl_emp_dept80(empno, ename, monthsal, gender, manager_id, department_id, department_name)
    values(employee_id, fullname,month_sal,  gender,manager_id,department_id,department_name)
     select employee_id
        , first_name || ' ' || last_name AS fullname 
        , nvl(salary + (salary * commission_pct), salary) AS month_sal
        , case when substr(jubun,7,1) in('1','3') then '남' else '여' end AS gender
        , E.manager_id
        , E.department_id
        , department_name
         from employees E JOIN departments D 
   on E.department_id = D.department_id
   where E.department_id in(30,50,80)
   order by E.department_id asc, employee_id asc;
   

merge(병합)

  • merge는 oracle만 존재한다
    어떤 2개 이상의 테이블에 존재하는 데이터를 다른 테이블 한곳으로 모으는것(병합)이다.
    --> 테이블에 데이터가 이미 있으면 업데이트를 실행하고 없을 경우 값을 넣어줘야 하는 경우에 이런 작업을 한번에 처리할 수 있도록 도와주는 구문을 제공하는데 이게 바로
    MERGE INTO이다
MERGE [TABLE/VIEW] - update 또는 insert할 테이블 혹은 뷰
	INTO[TABLE/VIEW/DUAL] - 비교할 대상 테이블 혹은 뷰(위 테이블과 동일할 경우 DUAL을 사용)
    ON [조건]

데이터 질의어(DQL)

  • Data Query Language
    => DQL 은 select 를 말한다.

트랜잭션 제어어(TCL)

  • Transaction Control Language
    => TCL은 commit, rollback을 말한다
  • ⭐(대단히 중요함) Transaction(트랜잭션) 처리 --> 뜻만 이해하기 넘김
    - transaction이라 함은 관련된 일련의 DML로 이루어진 한꾸러미(한세트)를 말함
    - transaction이라 함은 데이터베이스의 상태를 변환시키기 위하여 논리적 기능을 수행하는 하나의 작업단위를 말함
 예>   네이버카페(다음카페)에서 활동
            글쓰기(insert)를 1번하면 내포인트 점수가 10점이 올라가고(update),
            댓글쓰기(insert)를 1번하면 내포인트 점수가 5점이 올라가도록 한다(update)
           
           위와같이 정의된 네이버카페(다음카페)에서 활동은 insert 와 update 가 한꾸러미(한세트)로 이루어져 있는 것이다.
           이와 같이 서로 다른 DML문이 1개의 작업을 이룰때 Transaction(트랜잭션) 처리라고 부른다.
           
           Transaction(트랜잭션) 처리에서 가장 중요한 것은 
           모든 DML문이 성공해야만 최종적으로 모두 commit 을 해주고,
           DML문중에 1개라도 실패하면 모두 rollback 을 해주어야 한다는 것이다. 
           
           예를 들면 네이버카페(다음카페)에서 글쓰기(insert)가 성공 했다라면
           그 이후에 내포인트 점수가 10점이 올라가는(update) 작업을 해주고, update 작업이 성공했다라면
           commit 을 해준다. 
           만약에 글쓰기(insert) 또는 10점이 올라가는(update) 작업이 실패했다라면
           rolllback 을 해준다 

데이터 정의어(DDL)

  • Data Defination Language
    -- create, drop, alter, truncate
    --> 여기서 중요한 것은 DDL 문을 실행하면 자동적으로 commit;이 되어진다
    즉, auto commit 되어진다
  • DDL문을 실행하면 자동적으로 commit이 되기 때문에 rollback이 안된다

Truncate table 테이블명;

-- TRUNCATE table 테이블명;을 실행하면 테이블명에 존재하던 모든 행(row)들을 삭제해주고 테이블명에 해당하는 테이블은 완전초기화가 되어진다
중요한 사실은 truncate table 테이블명;은 DDL문이기에 auto commit;되어지므로 rollback이 불가하다

-- delete from 테이블명;을 실행하면 이것도 테이블명에 존재하던 모든 행(row)들을 삭제해준다

이것은 DML문이므로 rollback이 가능하다

   truncate table tbl_emp_copy1;
   -- Table TBL_EMP_COPY1이(가) 잘렸습니다.

데이터 제어어(DCL)

  • Data Control Language
    -- grant(권한 부여하기), revoke(권한 회수하기)
    --> 여기서 중요한 것은 DCL 문을 실행하면 자동 COMMIT;이 되어진다
    즉, auto commit이 되어진다

✅ orauser1에게 자신의 소유인 employees 테이블에 대해 select 할 수 있도록 권한을 부여하기

grant select on employees to orauser1;
-- Grant을(를) 성공했습니다

✅ orauser1에게 HR이 자신의 소유인 employees 테이블에 대해 update 할 수 있도록 권한을 부여하기

grant update on employees to orauser1;
    -- Grant을(를) 성공했습니다.

✅ orauser1 에게 HR이 자신의 소유인 employees 테이블에 대해 delete 할 수 있도록 권한을 부여하기

 grant delete on employees to orauser1;
     -- Grant을(를) 성공했습니다.

⚠️

 update employees set salary = 22222
    where employee_id = 100;    
    -- lock 걸림 
    -- 읽기는 가능 
    
       update employees set salary = 22222
    where department_id is null;   
    -- lock 걸림
    --- *local_orauser1에서 작업한 것.sql 
    --update HR.employees set first_name = '스티븐' 
    --where employee_id = 100;에서 lock이 걸리기 때문에 안됌 ,
   -- 커밋 롤백을 안해줘서 그럼, 커밋과 롤백을 꼭 해줘야 함 
   
  revoke select on employees to orauser1;
  --> orauser1에게 HR이 자신의 소유인 employees 테이블에 대해 select 
   

0개의 댓글