본문 바로가기
스터디/SQL

[정리노트] SQLD 2024년 개정판 - 집합 연산자

by 견습생L 2024. 8. 22.

 

[정리노트] SQLD 2024년 개정판 - 집합 연산자


집합 연산자

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

합집합

  •   두 집합의 총 합(전체) 출력
  •   UNION 과 UNION ALL 사용 가능
  1. UNIUON
    •   중복된 데이터는 한 번만 출력
    •   중복된 데이터를 제거하기 위해 내부적으로 정렬 수행
    •   중복된 데이터가 없을경우는 UNION 사용 대신 UNION ALL 사용 (불필요한 정렬 발생할 수 있으므로)
  2. UNION ALL
    •   중복된 데이터도 전체 출력

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

  •   UNION 
    SELECT EMPNO, ENAME, DEPTNO
      FROM EMP
     WHERE DEPTNO != 10
     UNION
    SELECT EMPNO, ENAME, DEPTNO
      FROM EMP
     WHERE DEPTNO = 20;


  •   UNION ALL
    SELECT EMPNO, ENAME, DEPTNO
      FROM EMP
     WHERE DEPTNO != 10
     UNION ALL
    SELECT EMPNO, ENAME, DEPTNO
      FROM EMP
     WHERE DEPTNO = 20;

교집합

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

ex) 10번 부서 정보와 20번 부서 정보가 각각 분리되어 있다 가정할 때 두 집합의 교집합

SELECT EMPNO, ENAME, SAL, DEPTNO
  FROM EMP
 WHERE DEPTNO != 10
INTERSECT
SELECT EMPNO, ENAME, SAL, DEPTNO
  FROM EMP
 WHERE DEPTNO = 20;

 

→ 부서번호가 10번이 아닌 집합은 20,30번 이고, 20번이 아닌 부서원은 10,30번 부서원이므로 두 집합의 교집합인 30번 부서원 정보만 출력됨


차집합

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

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

SELECT EMPNO, ENAME, SAL, DEPTNO
  FROM EMP
 WHERE DEPTNO != 10
 MINUS
SELECT EMPNO, ENAME, SAL, DEPTNO
  FROM EMP
 WHERE DEPTNO = 20;

→ 부서번호가 10번이 아닌 (20,30)번인 집합에서 20번 집합을 빼면 30번 부서원 집합만 출력됨


집합 연산자 사용시 주의사

  1. 두 집합의 컬럼 수 일치
  2. 두 집합의 컬럼 순서 일치
  3. 두 집합의 각 컬럼의 데이터 타입 일치
  4. 각 컬럼의 사이즈는 달라도 됨

ex) 두 집합의 컬럼의 데이터 타입이 다른 경우 에러 발생
아래와 같은 emp_t1 테이블이 있다고 가정, emp와의 합집합 출력

에러

 

해결 

→ 두 집합의 EMPNO 컬럼의 데이터 타입이 다르므로 한 쪽으로 맞춰줄 필요 있음

반응형