[SQL] 임시 테이블 생성 - CREATE TEMPORARY TABLE

·2025년 7월 11일

SQL

목록 보기
109/126

💡 임시 테이블은 데이터를 영구히 저장하는게 아니라
잠깐 임시로 저장할 테이블을 생성할 때 유용한 테이블

📌 데이터 저장에 따른 테이블의 종류 2가지

  1. 영구히 데이터를 저장할 수 있는 테이블 : heap table
  2. 임시로 데이터를 저장할 수 있는 테이블 : temporary table

📌 임시 테이블의 종류 2가지

  1. commit 할 때까지만 데이터를 보관하는 테이블
    관련옵션 : on commit delete rows
  2. 세션을 종료할 때까지만 데이터를 보관하는 테이블
    관련옵션: on commit preserve rows

문제1. commit 할때까지만 데이터를 보관하는 임시 테이블을 생성하시오

create global temporary table emp_temp1
( empno  number(10),
  ename  varchar2(20),
  sal    number(10) )
  on commit delete rows;
  
insert into emp_temp1(empno, ename, sal)
select empno, ename, sal
 from emp;
 
select * from emp_temp1;

-- emp_temp1 테이블의 데이터 사라짐
commit;

select * from emp_temp1;

문제2. dept 테이블과 똑같은 구조의 dept_temp1 이라는 테이블을 만드는데 임시 테이블로 생성하고 dept 테이블의 데이터를 입력하시오

create global temporary  table  dept_temp1
( deptno  number(10),
  dname   varchar2(14),
  loc     varchar2(13) )
on commit delete rows;

insert  into dept_temp1
select *
 from dept;
 
select * from dept_temp1;
commit;
select * from dept_temp1;
create global temporary  table  dept_temp1
( deptno  number(10),
  dname   varchar2(14),
  loc     varchar2(13) )
on commit delete rows;

insert  into dept_temp1
select *
 from dept;
 
select * from dept_temp1;
commit;
select * from dept_temp1;


drop  table  dept_temp1;

create  global  temporary  table  dept_temp2
on commit delete rows
as
 select *
  from dept
  where 1 = 2;
  
select * from dept_temp2;

insert into dept_temp2
select *
 from dept;
 
select *from dept_temp2;

commit;

select * from dept_temp2;

문제3. 세션이 종료 될때까지만 임시로 데이터를 저장하는 임시 테이블을 생성하시오

create  global  temporary  table  emp_temp2
on commit preserve rows
as
 select *
  from  emp
  where 1 = 2;
  
select * from emp_temp2;

insert into emp_temp2
select *
 from emp;
 
select *from emp_temp2;
commit;
select * from emp_temp2;

문제. 살인이 가장 많이 발생하는 요일은 언제인가?

, 일 , 월 , 화 , 수 , 목 , 금 , 토 , 미상
절도 ,33333,36789,35410,38103,36553,38617,37517,358
장물 ,279,403,441,882,466,447,442,21
손괴 ,6438,5570,5899,5795,5869,6386,6908,86
살인 ,209,203,183,204,194,203,178,16
강도 ,944,853,894,904,946,934,877,27
... 등등

create table crime_day
( crime_name varchar2(100),
  sun number(10),
  mon number(10),
  tue number(10),
  wed number(10),
  thu number(10),
  fri number(10),
  sat number(10),
  unknown number(10) );
  
select * from crime_day;

create or replace view crime_day_view	# create table 해도 됨
as
select *
 from crime_day
 unpivot (건수 for 요일 in (SUN, MON, TUE, WED, THU, FRI, SAT));

select * from crime_day_view;

select *
 from (  select crime_name, 요일, 건수, rank() over (order by 건수 desc) 순위
          from crime_day_view
          where trim(crime_name)='살인' )		# 또는 crime_name like '%살인%'
 where 순위 = 1;

0개의 댓글