Oracle - SET

목록



SET

두 가지 select문을 통해 얻어온 결과에 대해 집합 연산을 하는 명령문이다.

두 select문의 각 컬럼의 개수, 순서가 완전히 같아야만 한다.


UNION

중복을 허용하지 않는 합집합.

중복이 있다면 하나의 row(데이터)만 가져온다.

1
2
3
4
5
6
7
SELECT empno, ename, job, deptno
FROM emp
WHERE deptno=10
UNION
SELECT empno, ename, job, deptno
FROM emp
WHERE job='CLERK';
  • 쿼리 A

3개의 row가 조회된 것을 알 수 있다.

  • 쿼리 B

4개의 row가 조회된 것을 알 수 있다.

  • 쿼리 A, B를 UNION을 통해 조회

앞서 조회된 두 개의 쿼리 결과에서 중복된 결과인 ename='MILLER'를 제외한 나머지 7개의 row가 조회된 것을 알 수 있다.


UNION ALL

UNION과 달리 중복되더라도 모든 row의 데이터를 조회하는 합집합

1
2
3
4
5
6
7
SELECT empno, ename, job, deptno
FROM emp
WHERE deptno=10
UNION ALL
SELECT empno, ename, job, deptno
FROM emp
WHERE job='CLERK';
  • 쿼리 A
  • 쿼리 B
  • 쿼리 A, B를 UNION ALL로 조회

각각의 쿼리에 따른 결과가 중복을 포함하여 7개의 row로 조회된 것을 알 수 있다. (MILLER가 두 번 조회되었다.)


INTERSECT

두 가지 쿼리의 교집합을 구하는 쿼리이다.

1
2
3
4
5
6
7
SELECT empno, ename, job, deptno
FROM emp
WHERE deptno=10
INTERSECT
SELECT empno, ename, job, deptno
FROM emp
WHERE job='CLERK';
  • 쿼리 A
  • 쿼리 B
  • 쿼리 A, B를 INTERSECT로 조회

MINUS

두 가지 쿼리의 차집합을 구하는 쿼리이다. 정확히는 A 조회문에서 B조회문의 결과를 제외한 조회를 의미한다.

INTERSECT에서 사용한 쿼리를 재사용해보겠다.

1
2
3
4
5
6
7
SELECT empno, ename, job, deptno
FROM emp
WHERE deptno=10
MINUS
SELECT empno, ename, job, deptno
FROM emp
WHERE job='CLERK';
  • 쿼리 A
  • 쿼리 B
  • 쿼리 A,B를 MINUS를 이용한 조회

쿼리 A의 조회 결과에서 쿼리 B와 중복되는 결과, 즉 INTERSECT 결과만 빠진 나머지 쿼리 A의 조회 결과만 조회된 것을 알 수 있다.