[오라클] SQL - UNION에 관한 SQL 규칙

Head First SQL 책에 있는 UNION에 관한 내용을 보다가 이 내용을 참고로 다시 정리해 봅니다.

1. UNION에서 ORDER BY 사용

- UNION에서 ORDER BY가 여러 번 나오면 해석하지 못한다는 에러가 발생한다.

- UNION은 문장의 끝에 한 개의 ORDER BY만을 받아 들일 수 있다.

이유는 UNION이 여러 SELECT문의 결과를 합친 후 결과를 만들기 때문이다.

예제 1) 두 select문에 order by 가 모두 있을 경우 에러가 발생한다.

select 10 as a1, 20 as a2 from dual order by a1

union

select 30 as a3, 40 as a4 from dual order by a1

예제 2) 두 select문에 order by 가 마지막 select 문에만 있어야 한다.

select 10 as a1, 20 as a2 from dual

union

select 30 as a3, 40 as a4 from dual order by a1

- ORDER BY 절에 컬럼명은 첫번째 질의(select문)의 컬럼명만 사용이 가능하다.

예제 3) 이런 경우는 두번째 select문의 컬럼명을 사용했기 때문에 에러가 발생한다.

select 10 as a1, 20 as a2 from dual

union

select 30 as a3, 40 as a4 from dual order by a3

예제 4) 첫번째 select문의 컬럼명을 사용하였기에 정상 처리

select 10 as a1, 20 as a2 from dual

union

select 30 as a3, 40 as a4 from dual order by a1

2. 각 SELECT문의 열(컬럼) 수는 같아야 한다.

- 첫번째 SELECT문에서 두 열을 선택하고 두번째에서는 하나의 열을 선택 할 수 없다.

예제) 위 내용처럼 각 SELECT문의 열의 수가 다를 경우 에러가 발생한다.

select 10 as a1, 20 as a2 from dual

union

select 10 as a3 from dual

- 컬럼 수가 일치하지 않아 에러가 발생할 경우 강제로 일치 시키는 방법은 상수값 또는 NULL을 사용한다.

select 10 as a1, 20 as a2 from dual

union

select 10 as a3, NULL from dual

3. 각 SELECT문에 표현식과 집계 함수도 같아야 한다.

4. SELECT문의 순서는 중요하지 않다. 순서는 결과에 영향을 미치지 않는다

보기 1)

select 10 as a1, 20 as a2 from dual

union

select 30 as a1, 40 as a2 from dual

보기 2)

select 30 as a1, 40 as a2 from dual

union

select 10 as a1, 20 as a2 from dual

보기1)과 보기2)는 SELECT문의 순서가 달라도 결과는 같다는 뜻이다.

5. UNION의 결과에서 중복값은 하나로 나오는 것이 디폴트이다.

중복값이 모두 나오게 하려면 UNION ALL를 쓰면 된다.

6. 열의 데이터 타입은 같거나 서로 변환 가능한 값이어야 한다.

여기서 좀더 생각할 것은 데이터 타입만 같으며 되며 데이터 사이즈까지 같을 필요는 없다는 것이다.

예를 들어 같은 열에서 하나는 varchar2(100) 이고 다른 하나는 varchar2(200)인 경우라도 문제가 없다.

7. 컬럼명은 일치하지 않아도 된다. 그래서 강제로 컬럼명을 맞춘다고 해도 무조건 순서대로 컬럼명을 맞추기 때문에 이점을 유념하고 있어야 한다. 컬럼명이 다를 경우 첫번째 질의에 있는 컬럼명이 헤딩된다.

예제 1) 컬럼 순서를 바꾸고 강제로 alias를 준다고 해도 sum(a1)은 "50"이 아니라 "40"이 나온다.

select sum(a1), sum(a2)

from (

select 10 as a1, 20 as a2 from dual

union

select 30 as a2, 40 as a1 from dual

)

8. UNION은 내부적으로 중복된 값을 제거하는 과정에서 SORT기능(정렬)이 작동하며,

UNION ALL은 중복여부 관계없이 전체가 보여주므로 SORT가 일어나지 않는다.

고로 UNION ALL이 빠르다.

'먹고살기 > Oracle' 카테고리의 다른 글

oracle case when ~ then~ else end  (0) 2011.08.10
Oracle Sql Case 사용법  (0) 2011.08.10
ORACLE ROWNUM 활용  (0) 2011.07.08
EXP-00091  (0) 2011.07.08
[Oracle] distinct, rowid 중복 제거, 최신 데이터 하나만 가져오기  (1) 2011.06.30