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로 처리해야 한다는 걸 기억해야겠다.
'DB' 카테고리의 다른 글
| MySQL 과 Oracle NULL 처리 – IFNULL vs NVL (1) | 2025.08.11 |
|---|---|
| MySQL 과 Oracle 자동 증가(PK) 구현 차이/ LIMIT vs ROWNUM – 결과 제한 처리 (0) | 2025.08.11 |
| 오라클 DB 정리 – 정규화 · 참조 무결성 · 외래키 제약 · ENUM 대체 방법 (0) | 2025.06.11 |
| 오라클 책 정리 (0) | 2025.06.10 |
| 오라클 PL/SQL (0) | 2025.06.10 |