IT•개발 끄적/SQL

[SQL] Oracle insert, update, merge ,delete 알아보기

소다맛사탕 2021. 4. 23. 19:12
반응형

안녕하세요. 소다맛사탕 입니다.

 

지난 포스팅인 '테이블 생성(create table)'에 이어서 오늘은 데이터추가/수정 하거나 삭제하는 기본적인 DML을 알아 보겠습니다.

 

1. INSERT (신규 데이터 추가)

1-1. 기본적인 형태

INSERT INTO [스키마.]테이블명 
(컬럼1, 컬럼2, 컬럼3, ...)
VALUES
('값1', '값2', '값3', ...);

-- ex)
INSERT INTO TEST_EXAMPLE_TB
(SEQ_NO, DATA1, DATA2)
VALUES
(1, 'test01', 'test02');
-- seq_no number 타입

데이터를 추가하는 가장 기본적인 형태로

나열하는 컬럼과 값의 수와 순서, 데이터 타입이 일치해야 한다.

컬럼 순서를 바꾸더라도 values 절에 있는 값을 바뀐 순서와 맞추기만 하면 문제가 되지 않는다.

 

1-2. 컬럼명 생략

INSERT INTO [스키마.]테이블명
VALUES
(값1, 값2, 값3, ...);

-- ex)
INSERT INTO TEST_EXAMPLE_TB
VALUES
(2, 'uu03', 'tt04');
-- test_example_tb 컬럼 seq_no, data1, data2

컬럼명을 생략하고 values 절에는 테이블의 컬럼 순서대로 값을 입력해야 한다.

기본적으로 select * from test_example_tb 를 실행했을때 나오는 순서이다.

테이블의 컬럼 순서를 바꾸면 안되고, 타입을 맞춰야 한다.

 

1-3. INSERT ~ SELECT

; insert문에 select절을 이용.

INSERT INTO [스키마.]테이블명
(컬럼1, 컬럼2, 컬럼3, ...)
SELECT문;

-- ex)
INSERT INTO TEST_EXAMPLE_TB
(SEQ_NO, DATA1, DATA2)
SELECT
   NM_SEQ,
   PK_DATA1,
   DATA1
FROM TEST_EXAMPLE_CONT2
WHERE 1 = 1;
-- 적절한 조건절을 이용해 뽑아내고 싶은
-- 데이터를 잘 선정

insert문 안에 select문을 쓰는 경우는 다른 테이블이나 뷰의 데이터를

또다른 테이블에 삽입하는 방법이다.역시 insert문 테이블의 컬럼 순서와 타입을 맞춰야 한다.

또한, 타입 number <=> varchar2 데이터를 자동 변환해서 삽입한다.

 

 

2. UPDATE (기존 데이터 수정)

2-1. 기본적인 형태

UPDATE [스키마.]테이블명
   SET 컬럼1 = 변경값1,
       컬럼2 = 변경값2,
           ...
 WHERE 조건;
 
 -- ex)
 UPDATE TEST_EXAMPLE_TB
    SET SEQ_NO = 3,
        DATA1  = 'test111',
        DATA2  = 'uu11'
  WHERE SEQ_NO = 1;

이미 입력된 테이블의 데이터를 수정하는 것이므로

수정할 컬럼, 변경할 값이 입력 되어야 한다.

그리고 조건절(where)을 사용해 수정할 조건을 기술한다.

 

2-2. set절 서브쿼리

; update문 set절에 select절을 이용.

UPDATE [스키마.]테이블명
   SET (컬럼1, 컬럼2, 컬럼3, ...)
     = (변경할값1, 변경할값2, 변경할값3, ...)
 WHERE 조건;
 
 -- ex)
UPDATE TEST_EXAMPLE_TB
SET (SEQ_NO, DATA1, DATA2)
= (SELECT * FROM TEST_EXAMPLE_CONT2 WHERE nm_seq = 3);

-- set 서브쿼리 select절이 
-- 수정할 테이블의 컬럼수와 일치한다면 *를 써도 무방
-- 그렇지 않다면 set절의 컬럼들과 일치해야함

set절의 해당 컬럼을 변경할 때,  다른 테이블이나 뷰의 데이터를 이용하여 수정하는 방법이다.

수정하려는 테이블의 컬럼갯수, 타입이 select절과 일치하면 *써도 무방하다.

하지만, 문제는 서브쿼리는 다중 결과값을 가지고 있으면 안된다.

 

3. MERGE ( 조건에 따른 추가/수정)

merge문은 조건을 비교해서 테이블에 해당 조건에 맞는 데이터가 있으면 insert, 없으면 update를 수행.
MERGE INTO [스키마.]테이블명
   USING (
     대체적으로 SELECT절
   )
   ON (UPDATE될 조건)
WHEN MATCHED THEN
  SET 컬럼1 = 변경할값1,
      컬럼2 = 변경할값2,
      ...
  WHERE UPDATE조건
        DELETE WHERE UPDATE_DELETE 조건
WHEN NOT MATCHED THEN
  INSERT
  (컬럼1, 컬럼2, ...)
  VALUES
  (값1, 값2, ...)
  WHERE INSERT조건;
  
  
-- ex)
merge into test_example_tb teb
using (
     select 
     seq_num,
     data1,
     data2
     from TEST_EXAMPLE_TB2
     where seq_num = 1
     ) aa
  on (teb.seq_no = aa.seq_num)
when matched then
   update set
      teb.data1 = aa.data1,
      teb.data2 = aa.data2
when not matched then
   insert
   (seq_no, data1, data2)
   values
   (aa.seq_num, aa.data1, aa.data2);

-- ex2)
merge into test_example_tb teb
using (
     select 
     seq_num,
     data1,
     data2
     from TEST_EXAMPLE_TB2
     where seq_num = 1
     ) aa
  on (teb.seq_no = aa.seq_num)
when matched then
   update set
      teb.data1 = aa.data1,
      teb.data2 = aa.data2
   delete where (aa.seq_num = 2)
when not matched then
   insert
   (seq_no, data1, data2)
   values
   (aa.seq_num, aa.data1, aa.data2);

update절에 delete구문을 추가했는데, 이 경우는 update될 값을 판단해

조건에 맞는 데이터를 삭제하는 역할이다.

 

4. DELETE (기존 데이터 삭제)

-- FROM 생략 가능
DELETE [FROM] [스키마.]테이블
WHERE 조건;

-- ex)
delete test_example_tb where seq_no = 1;
-----------------------------------------
-- 특정 파티션만 삭제
DELETE [FROM] [스키마.]테이블 PARTITION (파티션명)
WHERE 조건;

※ 테이블을 생성할 때 파티션으로 테이블을 만들수 있는데, 파티션은 테이블에 있는 특정 컬럼 값을 기준으로 데이터를 분할해 저장해 놓은 것이다.

 

 

그래서 오늘은 간단하게 DML을 사용해 오라클에서 제공하는 기본적이 문법을 알아보았다.

추가적인 부분이나 설명이 더 필요한 경우는 생각날 때마다 고치겠습니다.