본문 바로가기

배우기/복습노트[oracle sql]

[복습] SQL | Oracle SQL의 분류(DDL, DML, DCL, TCL, DQL) 중 DML의 DELETE

728x90
반응형

3) DELETE: 행 삭제

문법은 아래와 같다.

delete 
   [from] table_name   -- 서브쿼리 못 옴
 [where 조건];             -- 서브쿼리 올 수 있음
조건절 생략하면 전체 행 삭제

from절에 서브쿼리가 못 오는 이유는, 인라인뷰는 가상의 테이블이므로 가상의 테이블을 지우라는 의미가 될 수 없기 때문이다.

where의 조건절을 생략하면 전체 행 삭제가 된다.

 

 

예를 들어 emp_t11에서 deptno=1000인 부서를 삭제하라고 한다면

delete

  from emp_t11

 where deptno = 1000

commit;

하면 된다.

 

예제를 하나 풀어보자

student_t1 테이블에서 이미경과 같은 나이(출생년도가 같은)의 학생 정보를 삭제하여라

 

 

추가 예제이다.

student_t1 테이블에서 몸무게가 학년 별 평균 몸무게보다 많이 나가면 삭제하여라

 

728x90

 

 

 

★  TRUNCATE / DELETE / DROP 차이점

1. 복구 여부에 따라

  - 복구 가능:drop(recyclebin), delete(undo, redo)

  - 복구 불가: truncate

 

2. 객체 삭제 여부 ★

  - 객체 삭제: drop

  - 객체 삭제 안함: delete, truncate

 

3. 수행 속도(delete vs. truncate), 데이터가 많을수록 대체적으로

  - 빠름: truncate (기록하지 않고 삭제하므로)

  - 느림:delete(redo/undo 기록 후 삭제하므로)

 

4. 데이터 삭제 범위

  - 일부 삭제 불가: drop, truncate

  - 일부 가능: delete

 

 

※ 참고: delete 복구

select * from student_t1     --6건

 

가. delete 전 데이터 확인

select * 

  from student_t1 as of timestamp(to_timastamp('2023/11/08 15:25', 'YYYY/MM/DD HH24:MI'));    --15건

 

나. 차집합을 구하기 보다는 원래 테이블 삭제(truncate 불가: 테이블 삭제 전 데이터가 원본 데이터임. 이걸 다시 복구하려고 함. 6건 데이터가 남아있는데 중복된 걸 제거하거나 하면 쿼리 다시 짜야해서 번거로우니 그냥 delete로 데이터 지워버리고 새롭게 raw data라고 판단이 되는 데이터를 넣는 것. 근데 truncate 하는 순간 as of timestamp로 가져오기 어려움)

delete from student_t1;

 

다. 데이터 삭제 전 테이블을 조회 후 현 테이블에 입력

insert into student_t1 
 select * 
  from student_t1 as of timestamp(to_timestamp('2023/11/08 15:25', 'YYYY/MM/DD HH24:MI')); 
  commit;

 

위 과정을 truncate를 했을 때로 테스트해보면

--truncate 시도
truncate table student_t1;

 

select * from student_t1;

select *
  from student_t1 as of timestamp(to_timestamp('2023/11/08 15:40', 'YYYY/MM/DD HH24:MI'));  -- 조회불가
ORA-01466  테이블 정의가 변경되었습니다. 데이터를 읽을 수 없습니다.
★이전 시점으로 돌아가는 select문은 그 시점 사이에 DDL(Truncate포함)이 수행된 경우라면 그 이전으로 돌아갈 수 없음.

 

 

728x90
반응형