집합 연산자
데이터 집합을 대상으로 연산을 수행하는 연산자를 말한다. UNION, UNION ALL, INTERSECT, MINUS가 있다.
1. UNION
합집합을 의미한다. 두 개의 데이터 집합이 있을 때, 각 집합의 원소를 모두 포함한 결과를 출력한다.
한국의 수출 품목을 조회해보자.
1 2 3 4 | SELECT GOODS FROM EXP_GOODS_ASIA WHERE COUNTRY = '한국' ORDER BY SEQ; | cs |
다음으로, 일본의 수출 품목을 조회한다.
1 2 3 4 | SELECT GOODS FROM EXP_GOODS_ASIA WHERE COUNTRY = '일본' ORDER BY SEQ; | cs |
한국과 일본의 수출품목을 조회해 각각 하나의 데이터 집합을 얻어냈다.
그렇다면, 한국과 일본 모두의 수출품목을 중복값 없이 조회하려면 어떻게 해야할까?
1 2 3 4 5 6 7 | SELECT GOODS FROM EXP_GOODS_ASIA WHERE COUNTRY = '한국' UNION SELECT GOODS FROM EXP_GOODS_ASIA WHERE COUNTRY = '일본'; | cs |
한국과 일본의 수출 품목이 총 20개이지만, 인출된 행은 15개이다.
왜냐면, 한국과 일본의 공통된 수출 품목 5개(선박, 원유제외 석유류, 자동차, 자동차부품, 전자집적회로)가 중복제거되어 하나씩 인출되었기 때문이다.
2. UNION ALL
UNION과 동일하나, 중복된 항목도 중복제거 없이 모두 조회된다.
1 2 3 4 5 6 7 | SELECT GOODS FROM EXP_GOODS_ASIA WHERE COUNTRY = '한국' UNION ALL SELECT GOODS FROM EXP_GOODS_ASIA WHERE COUNTRY = '일본'; | cs |
중복된 행이 제거되지 않았기 때문에, 20개 행이 인출되었다.
3. INTERSECT
교집합을 의미한다. 데이터 집합에서 공통된 항목만 추출해 반환한다.
1 2 3 4 5 6 7 | SELECT GOODS FROM EXP_GOODS_ASIA WHERE COUNTRY = '한국' INTERSECT SELECT GOODS FROM EXP_GOODS_ASIA WHERE COUNTRY = '일본'; | cs |
두 데이터 집합의 공통된 항목 5개가 인출된 것을 확인할 수 있다.
4. MINUS
차집합을 의미한다. 한 데이터 집합을 기준으로 다른 데이터 집합과 공통된 항목을 제외한 결과만 반환한다.
먼저 위치한 SELECT문이 기준이 된다.
1 2 3 4 5 6 7 | SELECT GOODS FROM EXP_GOODS_ASIA WHERE COUNTRY = '한국' MINUS SELECT GOODS FROM EXP_GOODS_ASIA WHERE COUNTRY = '일본'; | cs |
한국의 수출 품목 중 일본에서도 수출하는 품목을 제외한 항목 5개를 출력했다.
5. 집합 연산자의 제한사항
5-1. 집합 연산자로 연결되는 각 SELECT문의 SELECT 컬럼의 개수와 데이터 타입은 일치해야한다.
5-2. 집합 연산자로 SELECT문을 연결할 때 ORDER BY 절은 맨 마지막 문장에서만 사용할 수 있다.
5-3. BLOB, CLOB, BFILE타입의 컬럼에 대해서는 집합 연산자를 사용할 수 없다.
5-4. UNION, INTERSECT, MINUS 연산자는 LONG타입 컬럼에는 사용할 수 없다.
'📃 DATABASE > ORACLE' 카테고리의 다른 글
[SQL] 분석 함수 (0) | 2018.01.15 |
---|---|
[SQL] WITH절과 순환 서브쿼리 (0) | 2018.01.15 |
[SQL] 계층형 쿼리 (0) | 2018.01.09 |
[SQL] 내부조인과 외부조인 (0) | 2018.01.08 |
[SQL] 데이터베이스 객체_시노님(SYNONYM) (2) | 2017.11.11 |