본문 바로가기

sqld

2-10) 집합 연산자

집합 연산자
  • SELECT 문 결과를 하나의 집합으로 간주, 그 집합에 대한 합집합, 교집합, 차집합 연산
  • SELECT 문과 SELECT 문 사이에 집합 연산자 정의
  • 두집합의 컬럼이 동일하게 구성되어야 함 (각 컬럼의 데이터 타입과 순서 일치 필요
  • 전체 집합의 데이터 타입과 컬럼명은 첫번째 집합에 의해 결정됨

 

합집합
  • 두 집합의 총 합 (전체) 출력
  • UNION과 UNION ALL

 

1. UNION

  • 중복된 데이터는 한 번만 출력
  • 중복된 데이터를 제거하기 위해 내부적으로 정렬 수행
    • 중복된 데이터가 없는 경우는 UNION 대신 UNION ALL을 사용하여 성능 개선!

 

2. UNION ALL

  • 중복된 데이터도 전체 출력

 

예) 10번 부서 소속이 아닌 직원 정보와 20번 소속 직원 정보가 각각 분리되어 있다고 가정, 두 집합의 합집합

 

UNION 결과)

 

UNION ALL 결과)

  • DEPTNO가 20인 결과가 중복되어 출력

 

교집합
  • 두 집합 사이의 INTERSECT
  • 두 집합의 교집합(공통으로 있는 행) 출력

 

예) 10번 부서 정보와 20번 부서 정보가 각각 분리되어 있다고 가정, 두 집합의 교집합

  • 20, 30 / 10, 30 의 교집합 30

 

차집합
  • 두 집합 사이의 MINUS
  • 두 집합의 차집합 (한 쪽 집합에만 존재하는 행) 출력
  • A-B와 B-A는 다르므로 집합의 순서 주의!

 

예) 10번이 아닌 부서 정보와 20번 부서 정보가 각각 분리되어 있다고 가정, 두 집합의 차집합

  • 20, 30 / 20 의 차집합 30

 

집합 연산자 사용 시 주의 사항
  1. 두 집합의 컬럼 수 일치
  2. 두 집합의 컬럼 순서 일치
  3. 두 집합의 각 컬럼의 데이터 타입 일치
  4. 각 컬럼의 사이즈는 달라도 됨
  5. 개별 SELECT 문에 ORDER BY 전달 불가 (GROUP BY 전달 가능)
    • GROUP BY한 결과의 집합 연산 결과는 출력 가능 →역시 컬럼 수, 순서, 데이터 타입 일치 필요

 

예1) 두 집합의 컬럼 데이터 타입

  • EMP의 EMPNO는 숫자, EMP_T1의 EMPNO는 문자인 경우 TO_NUMBER(EMPNO)를 통해 데이터 타입 일치시킴

 

예2) 집합연산자와 ORDER BY의 사용

  • 개별 쿼리에 ORDER BY 절 전달 불가
  • 이 경우 첫 번째 ORDER BY에 의해 에러 발생
  • 마지막 ORDER BY는 전체 집합 연산의 결과를 정렬하는 것이므로 가능

 

 

 

 

'sqld' 카테고리의 다른 글

2-12) 윈도우 함수  (0) 2024.08.22
2-11) 그룹 함수  (0) 2024.08.21
2-9) 서브쿼리  (0) 2024.08.21
2-8) 표준 조인  (0) 2024.08.21
2-7) 조인  (0) 2024.08.21