sqld
집합연산자
자격증원톱
2026. 2. 24. 16:41
반응형
집합연산자
반응형

1) 집합 연산자란?
- 두 개 이상의 SELECT 결과를 하나의 결과로 결합할 때 씁니다.
- 대표 연산자: UNION, UNION ALL, INTERSECT, MINUS(Oracle)
사용 조건(중요)
- 합치는 각 SELECT는 컬럼 개수가 같아야 합니다.
- 각 컬럼의 데이터 타입이 호환되어야 합니다. (숫자↔숫자, 문자↔문자 등)
- 보통 컬럼 이름은 첫 번째 SELECT의 이름이 결과에 사용됩니다.
- 정렬(ORDER BY)은 맨 마지막에 한 번만 붙이는 게 원칙입니다.
2) 종류별로 한 번에 이해하기
UNION (합집합, 중복 제거)
- 두 결과를 합치되 중복 행은 1개로 정리합니다.
- 중복 제거 과정이 있어서 UNION ALL보다 느릴 수 있음.
예시(부서번호 목록 합치기):
SELECT DEPTNO FROM DEPT
UNION
SELECT DEPTNO FROM EMP;
- 결과: DEPT와 EMP에 등장한 DEPTNO를 겹치는 건 한 번만 보여줌
비유
- “A반 명단 + B반 명단 합치기”인데 같은 학생은 한 번만 남김
UNION ALL (합집합, 중복 유지)
- 두 결과를 합치되 중복 행도 그대로 모두 포함합니다.
- 중복 제거를 안 해서 보통 더 빠름.
예시:
SELECT DEPTNO FROM DEPT
UNION ALL
SELECT DEPTNO FROM EMP;
- 결과: EMP에 DEPTNO=30이 여러 번 있으면 30이 여러 줄로 그대로 나옴
비유
- “명단 합치기”인데 중복 학생도 전부 출력(복사본 포함)
INTERSECT (교집합, 공통만)
- 두 결과에 공통으로 존재하는 행만 반환합니다.
예시(둘 다에 존재하는 DEPTNO만):
SELECT DEPTNO FROM EMP
INTERSECT
SELECT DEPTNO FROM DEPT;
- 결과: EMP에도 있고 DEPT에도 있는 DEPTNO만 나옴
- 예: DEPT에는 40이 있는데 EMP에는 40이 없으면 40은 제외
비유
- “두 반 모두에 동시에 들어있는 학생(겹치는 학생)”만 뽑기
MINUS (차집합, A에만 있고 B엔 없는 것) 주로 Oracle
- 첫 번째 SELECT 결과(A) 에서
- 두 번째 SELECT 결과(B) 를 뺀 나머지(“A만의 것”)를 반환합니다.
예시(부서 테이블엔 있는데 직원이 없는 부서 찾기):
SELECT DEPTNO FROM DEPT
MINUS
SELECT DEPTNO FROM EMP;
- 결과: DEPT에는 존재하지만 EMP에는 등장하지 않는 DEPTNO만 출력
(예: 40번 부서에 직원이 없다면 40이 나올 수 있음)
비유
- “A반 명단에서 B반 명단에 있는 학생을 빼고, A반에만 있는 학생만 남기기”
3) 실전에서 자주 하는 실수 2가지
(1) ORDER BY 위치
- 집합 연산에서는 보통 이렇게:
SELECT ...
UNION
SELECT ...
ORDER BY 1;
- 각 SELECT 안에 ORDER BY를 넣으면 DB에 따라 오류/무시될 수 있습니다.
(2) 컬럼 맞추기
- 컬럼 개수/타입이 안 맞으면 에러 납니다.
- 그래서 필요하면 NULL이나 형 변환을 넣어 맞춥니다.
예:
SELECT DEPTNO, DNAME FROM DEPT
UNION ALL
SELECT DEPTNO, JOB FROM EMP;
(둘 다 2컬럼이고, 2번째 컬럼이 문자라면 가능)
한 줄 정리
- UNION: 합치기 + 중복 제거
- UNION ALL: 합치기 + 중복 그대로
- INTERSECT: 공통만
- MINUS: 앞에서 뒤를 빼기(A만 남김)
반응형