IT
[Oracle] 오라클 SET 연산자, 집합 쿼리
정미나
2013. 4. 29. 17:16
* SET 연산자로 묶이는 SELECT 문장의 열의 개수가 반드시 같아야 함
* SET 연산자로 연결되는 SELECT 문장에서 컬럼들의 순서와 데이터 타입이 일치해야 함
UNION
- A와 B란 데이터 셋이 있을 경우, A∪B로 표현되는 집합
- 두 테이블의 중복되지 않은 값들을 반환
SELECT cust_id FROM tb_event
WHERE event_no=1
UNION
SELECT cust_id FROM tb_event
WHERE event_no=2
=> 1번 이벤트와 2번 이벤트에 참여한 고객들의 리스트
UNION ALL
- UNION과 같으나 두 테이블의 중복되는 값까지 반환
+ UNION 연산자는 연결된 쿼리에서 동일한 row는 제거하고 한 row만 반환하게 된다.
따라서 추가적으로 필터링하는 로직이 숨어 있으므로 UNION ALL 보다는 비용이 높다.
SELECT cust_id FROM tb_event
WHERE event_no=1
UNION ALL
SELECT cust_id FROM tb_event
WHERE event_no=2
WHERE event_no=1
UNION ALL
SELECT cust_id FROM tb_event
WHERE event_no=2
=> 1번 이벤트와 2번 이벤트에 참여한 고객들의 리스트(단, 둘 다 참가했으면 두개의 row가 출력)
INTERSECT
- A와 B란 데이터 셋이 있을 경우, A∩B로 표현되는 집합
SELECT cust_id FROM tb_event
WHERE event_no=1
INTERSECT
SELECT cust_id FROM tb_event
WHERE event_no=2
WHERE event_no=1
INTERSECT
SELECT cust_id FROM tb_event
WHERE event_no=2
=> 1번 이벤트와 2번 이벤트 둘 다 참여한 고객들의 리스트
MINUS
- A와 B란 데이터 셋이 있을 경우, A-B 또는 Ac로 표현되는 집합
SELECT cust_id FROM tb_event
WHERE event_no=1
MINUS
SELECT cust_id FROM tb_event
WHERE event_no=2
=> 1번 이벤트에 참여한 고객 중에서 2번 이벤트에 참여하지 않은 고객들의 리스트WHERE event_no=1
MINUS
SELECT cust_id FROM tb_event
WHERE event_no=2