[Oracle] 오라클 #20, union과 union all 개념 및 예제 (+ intersect, minus)

union, 유니온

- 테이블을 합치는 기술

- 종으로 합치기


[비교] join,조인

- 테이블을 합치는 기술

- 횡으로 합치기


부장과 과장테이블 합치기

create table 과장

as 

select * from tblInsa where jikwi = '과장'; --과장테이블


create table 부장

as 

select * from tblInsa where jikwi = '부장'; --부장테이블


select * from 과장; --8명

select * from 부장; --6명


구조가 같은 두개이상의 테이블을 하나로 합친다.


select * from 과장

union

select * from 부장; 


>>구조가 같았기때문에 가능한것입니다.


구조가 다른경우(구조라는것은 컬럼명, 데이터형이 같아야 한다는 것입니다.)

--ORA-01790: expression must have same datatype as corresponding expression

select name,ssn from 과장

union

select name,basicpay from 부장;


구조가 동일(문자,숫자) 하더라도 union을 하면 안된다.(***)


구조와 의미도 같아야 한다.

select name,sudang from 과장

union

select name,basicpay from 부장; 수당과 기본급은 명백히 다른의미를 가지므로 union해서는 안된다.


--두 셋의 컬럼수도 동일해야 한다.

select name,sudang from 과장

union

select name,basicpay,null from 부장; 컬럼숫자가 하나 안맞으므로 테트리스에서 하나 삐져나온것처럼 논리적으로 맞지 않겠죠?


이름들 취합

--여러 테이블을 1개의 테이블 취합(***)하는 용도

select name from tblCustomer

union

select name from tblMember

union

select last||first from tblname

union

select name from tblStaff;



모든 선수에 대한 집합테이블


공격수 테이블

union

수비수 테이블


select * from 공격수

union

select * from 수비수;



회사(**부서별 게시판 예제)


1. 게시판 테이블 1개만 구성.

- 게시물의 부서를 구분하는 컬럼 생성 & 사용

- 업무 중 모든 게시물을 접근하는 업무가 빈번할 때


2. 게시판 테이블 부서별 구성

- 부서별로 별도의 테이블 생성

- 쪼개서 볼 업무가 많고, 합쳐서 볼 업무가 적을 때


영업부.총무부.기획부 테이블 생성

create table tblBoard1 --영업부

(

    seq number primary key,

    subject varchar2(1000) not null

);


create table tblBoard2 --총무부

(

    seq number primary key,

    subject varchar2(1000) not null

);


create table tblBoard3 --기획부

(

    seq number primary key,

    subject varchar2(1000) not null

);


게시물 입력(삽입)

insert into tblBoard1 values(1,'영업부 게시판입니다.');

insert into tblBoard1 values(2,'영업부 회식있습니다.');

insert into tblBoard1 values(3,'영업부 공지입니다.');


insert into tblBoard2 values(1,'총무부 게시판입니다.');

insert into tblBoard2 values(2,'총무부 회식있습니다.');


insert into tblBoard3 values(1,'기획부 게시판1입니다.');

insert into tblBoard3 values(2,'기획부 게시판2입니다.');

insert into tblBoard3 values(3,'기획부 게시판3입니다.');

insert into tblBoard3 values(4,'기획부 게시4판입니다.');


사장님이 원하는 방법으로 커스터마이징(임의상황입니다...)

- 일련번호 + 겹치지 않는 숫자. -> sequence 객체 사용


create sequence boardSeq; >>> 공통적인 Sequence 객체를 하나 만들어서

insert into tblBoard1 values(boardSeq.nextval,'영업부 게시판입니다.'); 테이블별로

insert into tblBoard1 values(boardSeq.nextval,'영업부 회식있습니다.');

insert into tblBoard1 values(boardSeq.nextval,'영업부 공지입니다.');


insert into tblBoard2 values(boardSeq.nextval,'총무부 게시판입니다.'); 번호만 다르도록 집어넣으면

insert into tblBoard2 values(boardSeq.nextval,'총무부 회식있습니다.');


insert into tblBoard3 values(boardSeq.nextval,'기획부 게시판1입니다.'); 전체 부서도 가져올 수 있고(union) 각각 부서별 정보도 가져올 수 있다.

insert into tblBoard3 values(boardSeq.nextval,'기획부 게시판2입니다.');

insert into tblBoard3 values(boardSeq.nextval,'기획부 게시판3입니다.');

insert into tblBoard3 values(boardSeq.nextval,'기획부 게시4판입니다.');




영업부 내용보기

select * from tblBoard1;


총무부 내용보기

select * from tblBoard2;


기획부 내용 보기

select * from tblBoard3;


사장님 -> 모든 게시물을 한번에 보게 해달라!

select * from

(select * from tblBoard1

union

select * from tblBoard2

union

select * from tblBoard3) order by seq desc;

>> 이런식으로 유니온처리를 하면 테이블 구조는 같으므로 전체 부서의 게시판 정보처럼 표현이 가능하다.(마치 한테이블인냥)


싸이월드로 치자면!! 

- 방명록 : 게시물 5년치 > 올해 6년차


1. 1개의 테이블 사용하는 경우!!

--> 일괄검색, 통합관리 편함.

--> (단점) : 데이터가 많아질 수록 검색에 시간이 오래걸린다.


2. 여러개 테이블 사용하는 경우!!

--> 테이블 개당 레코드를 줄여서 검색 속도를 줄이다.

--> (단점) 통합관리 > union 등의 기술을 사용해서 통합 (비용발생)


union, union all, intersect, minus (합집합, 교집합, 차집합)


create table tblUnionA(

    name varchar2(50) not null

);


create table tblUnionB(

    name varchar2(50) not null

);


insert into tblUnionA values('사과');

insert into tblUnionA values('귤');

insert into tblUnionA values('파인애플');

insert into tblUnionA values('바나나'); 겹침

insert into tblUnionA values('포도'); 겹침


insert into tblUnionB values('키위');

insert into tblUnionB values('바나나'); 겹침

insert into tblUnionB values('오렌지');

insert into tblUnionB values('포도'); 겹침

insert into tblUnionB values('복숭아');



union과 union all의 차이

바나나, 포도가 겹치는 데이터였는데 "중복값이 제거"가 되었다.

- union은 중복값이 있으면 중복값은 제거해준다.(레코드 단위 비교, 즉 만약 컬럼1개가 더있어서 갯수도 있다면 갯수도 같아야 중복으로 본다.)

select * from tblUnionA

union

select * from tblUnionB;


select name,count(*) from

(select * from tblUnionA

union

select * from tblUnionB) group by name;


select * from tblUnionA

union all   중복값도 표현

select * from tblUnionB;


교집합

select * from tblUnionA

intersect --교집합

select * from tblUnionB;


select * from tblInsa where buseo='기획부' --7레코드

intersect --교집합

select * from tblInsa where jikwi='부장'; -- 7레코드


차집합

select * from tblUnionA

minus  --차집합 (A-B) 

select * from tblUnionB;



select * from tblUnionB

minus  --차집합 (B-A) 

select * from tblUnionA;

댓글

Designed by JB FACTORY