본문 바로가기
sqld

집합연산자

by 자격증원톱 2026. 2. 24.
반응형

집합연산자

반응형

 

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만 남김)
반응형

'sqld' 카테고리의 다른 글

윈도우함수가 무엇인가?  (1) 2026.02.25
그룹함수  (0) 2026.02.24
서브쿼리  (0) 2026.02.24
JOIN 이해하기  (0) 2026.02.23
집계함수와 group by절  (0) 2026.02.23