Programming/Database (Oracle, SQL)

[Oracle/SQL] 집합연산자 UNION, UNION ALL, INTERSECT, MINUS

Sujin Lee (Daisy) 2020. 2. 18. 23:57

집합연산자란? 

 - 여러 건의 데이터들(집합)을 연산

연산자 종류 내용
UNION 두 집합의 합집합. 중복제거O. 정렬O.
UNION ALL 두 집합의 합집합. 중복제거X. 정렬X.
INTERSECT 두 집합의 교집합.
MINUS 두 집합의 차집합.

 - 집합연산자를 사용할 때는

   1) 두 집합의 SELECT절에 오는 컬럼의 갯수가 같아야하고 

   2) 두 집합의 SELECT 절에 오는 컬럼의 데이터형이 같아야하며 

   3) 두 집합의 컬럼명은 달라도 괜찮음 

 - UNION, INTERSECT, MINUS는 성능이 좋지 않다 

   ==> 데이터 양이 많거나 집합연산자를 많이 사용할 경우 속도가 느려짐

   ==> 집합 연산자 보다는 다른 방법의 사용을 권장함. 

 - MINUS 연산자는 결과값이 큰 집합을 먼저 적어야 한다. 

 

UNION 예시

SELECT studno,name,deptno1,1
FROM student
WHERE deptno1=101
UNION
SELECT profno,name,deptno,2
FROM professor
WHERE deptno=101;

 - 첫번째 SELECT문에서 선택한 학생 데이터와 두번째 SELECT문에서 선택한 교수 데이터가 합집합으로 나오는 것을 확인할 수 있다.

 - 또한, 앞에서 말한 집합연산자 사용시의 3가지 요건(컬럼 갯수 같고, 데이터형 같고, 컬럼명은 달라도 됨)을 확인할 수 있다. 

 - 맨 마지막 컬럼 값인 1은 첫번째 SELECT 문에서 가져온 데이터라는 것을, 2는 두번째 SELECT 문에서 가져온 데이터라는 것을 나타낸다. 

 

UNION, UNION ALL 차이

--ex1) UNION: 합집합. 중복제거O. 정렬O. 
SELECT studno,name
FROM student
WHERE deptno1=101
UNION
SELECT studno,name
FROM student
WHERE deptno2=201;

--ex2) UNION ALL: 합집합. 중복제거X. 정렬X.
SELECT studno,name
FROM student
WHERE deptno1=101
UNION ALL
SELECT studno,name
FROM student
WHERE deptno2=201;

 - UNION을 했을 때는 studno가 오름차순으로 정렬되며, 중복이 제거되어 James Seo가 한 번만 들어간 것을 볼 수 있다.

 - 반면, UNION ALL을 했을 때는 studno가 정렬되지 않으며, 중복제거가 되지 않아 James Seo가 두 번 들어간 것을 확인할 수 있다. 

 

INTERSECT 예시

SELECT studno,name
FROM student 
WHERE deptno1=101
INTERSECT
SELECT studno,name
FROM student
WHERE deptno2=201;

 - 1전공(deptno1)이 101인 집합과 2전공(deptno2)이 201인 집합의 교집합이 출력된다.

 

MINUS 예시

SELECT empno,ename,sal
FROM emp
MINUS
SELECT empno,ename,sal
FROM emp
WHERE sal>2500;

 - emp 전체 집합에서 월급이 2500 초과인 사람을 제외한 차집합을 출력한다.

   (즉, 월급이 2500 미만인 사람이 출력됨)

 

반응형