쥬로그

오라클 - SELECT INTO, INSERT INTO SELECT 본문

Study/Oracle

오라클 - SELECT INTO, INSERT INTO SELECT

쥬쥬씨 2021. 8. 30. 15:11
반응형

< SELECT INTO, INSERT INTO SELECT >

* SELECT INTO(CREATE TABLE SELECT ... INTO)는 쿼리 결과를 테이블로 생성하고 싶을 때 사용한다.

* INSERT INTO SELECT는 쿼리 결과를 기존의 테이블에 추가하고 싶을 때 사용한다.


* SELECT INTO

- 쿼리 결과를 새 테이블로 만든다.

- 기존에 존재하지 않는 테이블이 새로 생성된다. (일종의 와 동일한 효과)

- 오라클에서는 아래와 같이 선언한다. (뷰와 차이점)

 

    CREATE TABLE 테이블명 AS SELECT * FROM 테이블명

 

√ SQL은 비절차적 언어로 에러 시 튜닝 처리

 

ex) 업무가 SALESMAN인 직원만 찾아서 따로 emp_salesman이라는 테이블을 생성해서 넣으시오.

-> create table emp_salesman as select * from emp where job = 'SALESMAN';

-> select * from emp_salesman

 

 

* INSERT INTO SELECT

- 쿼리 결과를 기존의 테이블에 추가한다. (기존 테이블이 존재해야 함)

- SELECT하는 테이블과 INSERT하는 테이블은 동일한 구조를 가져야 한다.

- 두 개의 별도 쿼리를 하나로 합침

 

    INSERT INTO 테이블명1 SELECT * FROM 테이블명2 WHERE 조건절 ...

 

ex) emp 테이블에서 job이 salesman인 레코드를 찾아서 emp_salesman 테이블에 추가하시오.

-> truncate table emp_salesman; (테이블 존재, 내용만 지우기)

    select * from emp_salesman; (레코드가 없다는 것 확인하기)

    insert into emp_salesman select * from emp where job = 'SALESMAN';

    select * from emp_salesman;

 

 

* CASE ... WHEN ... END

- SQL의 조건문(if/switch문)에 해당

- 조건값에 따른 처리를 구분할 수 있다.

 

    CASE WHEN 조건값1 THEN...

            WHEN 조건값2 THEN...

            ELSE ...

    END

 

ex) emp 테이블에서 직원명, ABBR_JOB을 최대 3자로 앞쪽 세 자를 소문자로 출력하고, JOB을 같이 표시하시오

-> select emp.ename, (ename 출력)

    case

      when length(emp.job) > 3 then lower(substr(emp.job, 1, 3))

      (= length 함수 사용하여 3자 초과일 경우 substr 함수를 이용해 첫자부터 세글자만 lower(소문자)로 출력되도록)

      when length(emp.job) <= 3 then lower(emp.job)

      (= length 함수 사용하여 3자 이하일 경우 lower(소문자)로 출력되도록)

    end as abbr_job, emp.job from emp; (abbr_job과 JOB 함께 출력)


< Point > 

☆ 기존에 존재하는 테이블에 쿼리 결과를 넣고 싶을 때는 INSERT INTO SELECT 문장을 사용한다.

☆ 쿼리 결과를 새 테이블에 넣고 싶을 때는 CREATE TABLE SELECT... INTO 문장을 사용한다.

    단, 새 테이블에 내용이 비어 있어야 한다.

☆ Name 컬럼의 글자가 3자 이하면 그대로 출력하고 3자가 넘어가면 앞 쪽 세 글자만 출력하는 쿼리는 아래와 같다.

    CASE WHEN LENGTH(Name) > 3 THEN SUBSTR(Name, 1, 3) WHEN LENGTH(Name) <= 3 THEN Name END

    -> SUBSTR()은 원하는 글자를 떼내는 함수이고, LENGTH()는 문자열 길이를 출력하는 함수이다.


< 요약 >

* SELECT INTO(CREATE TABLE SELECT * FROM...)

- 쿼리문의 결괏값을 새로운 테이블로 만들고 레코드를 추가한다.

* INSERT INTO SELECT

- 쿼리문의 결괏값을 "기존" 테이블에 레코드로 추가한다.

* CASE... WHEN... END

- 조건식에 따라 다른 처리를 할 수 있다.

 

 

 

 

 

반응형