[23.01.05] 52일차 [데이터베이스]

W·2023년 1월 5일
0

국비

목록 보기
77/119

데이터조작어(DML)

  • 테이블에 새로운 행 추가(insert)
  • 테이블의 기존 행 수정(update)
  • 테이블의 기존 행 삭제(delete)

insert

insert into departments
values (280, 'Java', 200, 1700);

select *
from departments
order by department_id desc;

insert into departments(department_name, location_id, manager_id, department_id)
values ('Jsp', 1700, 201, 290);

select *
from departments
order by department_id desc;

  • 자동으로 null값 삽입
![](https://velog.velcdn.com/images/tlqdnwls/post/ad9fcbd7-255d-449f-bc2c-5da4cda276be/image.png)

select *
from departments
order by department_id desc;

insert into departments
values (310, 'Html', 202, null);

select *
from departments
order by department_id desc;

  • insert 구문 사용 후, commit 해야함
  • oracle은 values절 뒤에 한행씩만 추가됨

  • employees 테이블과 구조가 동일한 복사본의 빈테이블 생성
create table copy_emp
as select *
from employees
where 1=2;

desc copy_emp;

insert into copy_emp
select *
from employees;

commit;

udpate

  • 113번 사원 정보 확인
select employee_id, salary, department_id
from employees
where employee_id = 113;

  • 113번 사원 부서아이디, 급여 update
update employees
set department_id = 50
where employee_id = 113;
  • 113번 사원 정보 다시 확인
select employee_id, salary, department_id
from employees
where employee_id = 113;

commit

  • update 구문 작성 시 where절을 생략한 경우
update copy_emp
set department_id = 110;

select employee_id, department_id
from copy_emp;

rollback;

select employee_id, department_id
from copy_emp;

select employee_id, last_name, job_id, salary
from copy_emp
where employee_id in (113,205);

update copy_emp
set job_id =
(select job_id
from copy_emp
where employee_id = 205),
salary =
(select salary
from copy_emp
where employee_id = 205)
where employee_id = 113;

select employee_id, last_name, job_id, salary
from copy_emp
where employee_id in (113,205);

commit;

  • insert, update, delete => 작업단위 : row(행)

delete

delete from departments
where department_id = 300;

select *
from departments 
order by department_id desc;

commit;

  • delete 구문 작성 시 where절을 생략한 경우
delete from copy_emp;

select  *
from copy_emp;

rollback;

select  *
from copy_emp;

  • location_id =1800인 부서에 소속된 사원들 삭제
delete from copy_emp
where department_id =
(select department_id
from departments
where location_id=1800);

select employee_id, last_name, department_id
from copy_emp
where department_id =
(select department_id
from departments
where location_id = 1800);


commit;

트랜잭션 처리하기

트랜잭션(Transaction)

  • 논리적인 작업 단위
  • 여러 DML이 모여서 하나의 트랜잭션이 구성됨.
  • 하나의 DDL 구문이 하나의 트랜잭션을 구성함.
  • 하나의 DCL 구문이 하나의 트랜잭션을 구성함.
  • DML 작업 후 commit, rollback으로 트랜잭션 종료해야함.

트랜잭션 제어 명령어(TCL)

  • COMMIT : 트랜잭션을 영구히 저장함.
  • ROLLBACK : 트랜잭션 처음으로 되돌림.
  • SAVEPOINT : 트랜잭션 진행 중 되돌아갈 지점(기점, 포인트)을 생성함.

트랜잭션 시작 및 종료

  • 시작 : 첫 번째 DML 구문 실행 시
  • 종료 : COMMIT 또는 ROLLBACK 실행 시
    DDL 또는 DCL 구문 실행 시(autocommit)
    SQL *PLUS 정상 종료 시 (autocommit)
    시스템 장애 시(autorollback)

// 트랜잭션 시작
rollback;
// 트랜잭션 종료

// 트랜잭션 시작
create table ---; (DDL) autocommit 내포
// 트랜잭션 종료

// 트랙잭션 시작
update --;
update --;
insert --;
create table ---;(DDL) autocommit 내포
//트랜잭션 종료

// 트랜잭션 시작
delete --;
update --;
SQLPlus 또는 SQLdeveloper를 정상 종료함.
(autocommit)
// 트랜잭션 종료

// 트랜잭션 시작
delete --;
update --;
SQLPlus 또는 SQLdeveloper를 정상 종료함.
(autorollback)
// 트랜잭션 비정상 종료함


savepoint가 중간 저장하는 명령어는 아니다
트랜잭션 진행 중 되돌아 갈 수 있는 지점

select employee_id, last_name, salary, department_id
from copy_emp
where department_id = 30;

update copy_emp
set salary = salary * 1.5
where department_id = 30;

select employee_id, last_name, salary, department_id
from copy_emp
where department_id = 30;

select employee_id, last_name, salary, department_id
from copy_emp
where department_id in (30,110)
order by department_id;

update copy_emp
set salary = salary *1.2
where department_id = 110;

select employee_id, last_name, salary, department_id
from copy_emp
where department_id in (30,110)
order by department_id;

savepoint test1;
delete from copy_emp
where department_id = 50;

select employee_id, last_name, department_id
from copy_emp
where department_id = 50;

rollback to test1;

select employee_id, last_name, department_id
from copy_emp
where department_id in (30, 50, 110)
order by department_id;

commit;

치환변수

sqlplus에서 시행

  • 숫자인 경우

    l로 다시 불러와 employee_id 계속 조회 가능

  • 문자열인 경우

스크립트 파일 생성 및 실행하기

  • 파일 생성(insert 구문에서 활용)

  • 실행 하기
SQL> @/home/oracle/new_dept.sql

  • slq developer에서 스크립트 파일 생성 실행하기
    클릭해서 스크립트 파일 생성

입력 후 저장.
불러오기 해서 실행 할 수 있음.

연습문제

1번

select last_name
from employees
where lower(last_name)like '%a%e%'
or lower(last_name)like '%e%a%';

2번

select last_name, job_id, salary
from employees
where (job_id in ('SA_REP', 'ST_CLERK'))
and
(salary not in (2500, 3500, 7000));

3번

select last_name "Name", length(last_name) "Length"
from employees
where 
lower(last_name) like 'j%' or
lower(last_name) like 'a%' or
lower(last_name) like 'm%'
order by last_name;

4번

select last_name "Name", length(last_name) "Length"
from employees
where lower(last_name) like lower('&START_LETTER%')
order by last_name;

0개의 댓글