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;
'Database > Oracle' 카테고리의 다른 글
| [Oracle] 오라클 #22, Index(인덱스) 개념 및 예제 (2) | 2019.03.15 |
|---|---|
| [Oracle] 오라클 #21, 트랜잭션(Transaction)의 개념 및 예제(commit, rollback, savepoint) (0) | 2019.03.14 |
| [Oracle] 오라클 #19, 의사컬럼(ROWNUM) 사용법 (2) | 2019.03.09 |
| [Oracle] 오라클 #18, Alter 테이블 구조 변경 (2) | 2019.03.07 |
| [Oracle] 오라클 #17, 뷰(view) 예제 및 응용 (2) | 2019.03.05 |