[DB] MERGE 문

박세진·2021년 2월 19일
0
post-thumbnail

오랜만의 블로그 포스팅 !
자주 쓰고 싶은데 첫 출근주라는 핑계로 약간은 늘어져있었던 것 같다. 반성해야겠다.
오늘도 출근해서 업무를 하다가 문득 SQLD 자격증 접수일이 며칠 안남았다는 사실을 깨달았다. 그래서 공부도 할 겸, 복습도 할 겸 구루비 사이트에 들어가서 이것저것 찾아보았다.


MERGE문 ? 😧

  • 조건에 따라서 데이터의 삽입, 갱신, 삭제 작업을 한꺼번에 할 수 있다.
  • 해당 행이 존재하는 경우 UPDATE(DELETE 포함)를 수행하고 새로운 행일 경우 INSERT를 수행한다.
  • 대상 테이블에 대한 UPDATE/INSERT 조건은 ON절에 의해 결정된다.

MERGE Syntax

MERGE INTO 대상 테이블 / 뷰
USING 비교할 서브 테이블 / 뷰 / 서브쿼리
ON (UPDATE / INSERT를 하게 될 조건)
WHEN MATCHED THEN
ON 조건절이 True인 ROW에 수행할 내용 (UPDATE / DELETE 등)
WHEN NOT MATCHED THEN
ON 조건절에 맞는 ROW가 없을 때 수행할 내용 (INSERT)

예제를 보면서 좀 더 이해해보자.

예제1.

부서번호 20, 30번인 사원이 존재하면 급여를 10% 인상하고, 존재하지 않으면 급여가 1000보다 큰 사원을 등록하자.

우선, 부서번호 10,20번의 사원정보를 가지는 테스트 테이블을 생성하자.
테이블을 만들 때에는 생성 후 데이터를 하나하나 다 넣어주지 않고, AS SELECT문을 이용해서 scott계정의 emp 테이블의 데이터를 복사해서 사용했다.

원래 emp 테이블에는 사원번호 10, 20, 30 인 사원들의 정보가 존재한다.
그리고 나는 여기서 10,20번의 사원들의 정보만 가져와 emp_merge_test라는 새로운 테이블을 만들었다.

참고

AS SELECT ? 😴
기존에 존재하는 테이블을 가져와서 똑같이 복제하여 새로운 테이블을 만들 수 있다.
테이블 생성시 기존의 데이터 유형을 일일이 다시 재정의하지 않아도 된다.
주의할점은 NOT NULL을 제외한 나머지 제약 (기본키, 외부키, unique 등)은 적용되지 않으므로 넣으려면 ALTER TABLE 문을 사용해야 한다.

이제 MERGE문을 적용해보자.

대상 테이블은 새로만든 emp_merge_test이므로 첫줄에 얘를 써준다.
USING 절에는 테이블, 뷰, 서브쿼리가 올 수 있다고 위에서 설명하였다. 여기서는 뷰를 넣었다.
emp_merge_test에 있는 데이터가 emp 테이블에도 있는 데이터인지 유무에 따라서 UPDATE/INSERT 가 결정되므로 ON절에는 m.empno = e.empno가 들어가야 한다.

데이터가 있다면 -> UPDATE
데이터가 없다면 -> INSERT

이때 주의할 점은, 위에서 대상 테이블을 명시해 두었으므로 아래의 UPDATE, INSERT 구문에서 테이블 명을 명시해주지 않는다.

원래 UPDATE 문은
UPDATE 테이블명 SET 컬럼명 = 데이터; 이런 식이다. 하지만 MERGE 문의 UPDATE 구문을 보면
UPDATE SET 컬럼명 = 데이터; 임을 알 수 있다. 이 점에 주의하자!


마치면서

MERGE 문에 대해 간단하게 정리해보았다.
구루비 사이트를 보면서 기초부터 다시 차근차근 공부하고 싶다. 역시 DB는 재밌다 !

profile
계속해서 기록하는 개발자. 조금씩 성장하기!

0개의 댓글