본문 바로가기

DB

오라클 - SQL 집합 연산자 & DML 정리

 

1. UNION

  • 두 개 이상의 SELECT 결과를 합치는 연산자.
  • 중복된 결과는 자동으로 제거됨 (DISTINCT 효과).
  • 컬럼 개수, 타입이 동일해야 함.
SELECT name FROM tStudent
UNION
SELECT name FROM tTeacher;

학생 + 선생님 이름을 중복 없이 합쳐서 출력.


2. UNION ALL

  • UNION과 비슷하지만, 중복까지 모두 포함.
  • DISTINCT 작업이 없어서 UNION보다 성능이 빠름.
SELECT name FROM tStudent
UNION ALL
SELECT name FROM tTeacher;

학생 + 선생님 이름을 중복 포함해서 출력.


3. INTERSECT

  • 공통된 결과만 추출.
  • 자동으로 중복 제거됨.
SELECT name FROM tStudent
INTERSECT
SELECT name FROM tTeacher;

 학생과 선생님 중 이름이 같은 사람만 출력.


4. MERGE (Upsert 개념)

  • INSERT + UPDATE를 합쳐서 처리.
  • 데이터가 있으면 UPDATE, 없으면 INSERT.
  • 오라클에서 데이터 동기화할 때 자주 사용됨.
MERGE INTO tEmployee tgt
USING tNewData src
ON (tgt.emp_id = src.emp_id)
WHEN MATCHED THEN
    UPDATE SET tgt.salary = src.salary
WHEN NOT MATCHED THEN
    INSERT (emp_id, name, salary)
    VALUES (src.emp_id, src.name, src.salary);

 직원 정보가 있으면 급여 업데이트, 없으면 신규 등록.


5. UPDATE FROM (Oracle은 직접 지원 x)

  • 다른 테이블 데이터를 참조해서 UPDATE할 때 사용하는 구문.
  • 하지만 오라클은 UPDATE … FROM을 지원하지 않는다.
  • 대신 MERGE서브쿼리로 해결해야 한다.
UPDATE tEmployee tgt
SET tgt.salary = (
    SELECT src.salary
    FROM tNewData src
    WHERE src.emp_id = tgt.emp_id
)
WHERE EXISTS (
    SELECT 1
    FROM tNewData src
    WHERE src.emp_id = tgt.emp_id
);

 tNewData의 salary 값을 가져와 tEmployee를 업데이트.


 

문법 기능 특징 빈도
UNION SELECT 결과 합치기 (중복 제거) DISTINCT 효과, 성능 다소 떨어짐 매우 높음
UNION ALL SELECT 결과 합치기 (중복 허용) 성능 빠름 매우 높음
INTERSECT 공통 데이터 추출 중복 제거 자동 낮음
MERGE INSERT + UPDATE 통합 데이터 동기화 / Upsert 높음
UPDATE FROM 다른 테이블 참조 UPDATE Oracle 미지원 → MERGE/서브쿼리 대체 매우 높음

 

  • MERGE는 오라클 환경에서 진짜 자주 쓰일 것 같다. 테이블 동기화 작업할 때 아주 유용.
  • 오라클이 UPDATE … FROM을 지원하지 않는다는 것도 오늘 알게 된 포인트. 대신 EXISTS나 MERGE로 처리해야 한다는 걸 기억해야겠다.