게시일: Oct 27, 2011 2:38:28 AM
-- UNION
select 2 col from dual union
select 3 col from dual union
select 1 col from dual union
-- select '1' col from dual union -- ORA-01790: expression must have same datatype as corresponding expression
select null col from dual union
select 1 col from dual;
---
COL
---
1
2
3
---
결과 분석 : distinct 수행, order by 수행
-- UNION ALL
select 2 col from dual union all
select 3 col from dual union all
select 1 col from dual union all
select null col from dual union all
select 1 col from dual;
---
COL
---
2
3
1
1
---
결과 분석 : 모든 row를 반환, order by 수행 안함.
-- INTERSECT
select col
from (
select 5 col from dual union all
select 4 col from dual union all
select 2 col from dual union all
select 2 col from dual union all
select 3 col from dual union all
select null col from dual union all
select 1 col from dual
)
intersect
select col
from (
select 5 col from dual union all
select null col from dual union all
select 2 col from dual
)
;
---
COL
---
2
5
---
결과 분석 : distinct 수행, order by 수행
-- MINUS
select col
from (
select 5 col from dual union all
select 4 col from dual union all
select 2 col from dual union all
select 2 col from dual union all
select 2 col from dual union all
select 7 col from dual union all
select null col from dual union all
select 1 col from dual
)
minus
select col
from (
select 5 col from dual union all
select null col from dual union all
select 2 col from dual
)
;
---
COL
---
1
4
7
---
☞ SET 연산자를 사용하는 문장에서는 NULL은 특별히 신경쓰지 않아도 된다.
숫자형, 날짜형 데이터와 null이 궁합이 맞게 된 것은 Oracle 9i 부터...
☞ SET 연산자의 규칙과 제한 사항
1. SET 연산자로 묶여지는 SELECT 문장에서 BLOB, CLOB, BFILE, VARRAY 그리고 중첩 테이블(nested table) 타입인 컬럼은 사용할 수 없다.
2. UNION, INTERSECT, MINUS 연산자를 사용할 경우 SELECT 문장에서 LONG 타입 컬럼은 사용할 수 없다.
단, UNION ALL 에서는 사용할 수 있다.
3. SET 연산자와 함께 사용되는 SELECT 문장의 경우 FOR UPDATE 절을 사용할 수 없다.
4. SET 연산자를 사용할 경우 ORDER BY 절은 문장 전체에서 맨 마지막에 한 번만 사용할 수 있으며,
SET 연산자로 연결되는 SELECT 문의 일부에서 서브쿼리가 사용된다면 서브쿼리 내부에서도 ORDER BY 절이 사용될 수 없다.
select 1, 2 from dual
order by 1 -- ORA-00933: SQL command not properly ended
union
select 2, 3 from dual;
select 1, 2 from dual
union
select 2, 3 from dual
order by 1;