DB-Join,Union

2 minute read

Join - Cross Join, Self Join, Outer Join, Inner Join

2개의 이상의 테이블을 조합하여 하나의 열로 표현하는 것 이다.

Cross Join

두 테이블에서 곱집합을 반환한다.
m개의 열을 가진 테이블과, n열을 가진 테이블이 교차 조인되면 m x n개의 열을 생성

1
select jikwon_name, buser_name from jikwon, buser; -- 직원이름(16)과 부서이름(4)이 1:1 대응. 16*4 = 64개.

Self Join

자기 자신을 조인하는 것

1
2
select a.jikwon_name, b.jikwon_jik from jikwon a, jikwon b where a.jikwon_no=b.jikwon_no; 
-- 'a, b'라는 별명을 줄 수 있다.

Outer Join

Outer Join은 조인하는 여러 테이블에서 한 쪽에는 데이터가 있고 한 쪽에는 데이터가 없는 경우(NULL 값), 데이터가 있는 쪽 테이블의 내용을 전부 출력하는 방법이다. 없는 쪽의 값은 NULL값으로 나오게 된다.
1) Left Outer Join

  • 왼쪽에 있는 테이블의 모든 결과를 가져온 후 오른쪽 테이블의 데이터를 매칭하고, 매칭되는 데이터가 없는 경우 NULL을 표시한다.


1
2
3
select jikwon_name, buser_name from jikwon, buser where buser_num=buser_no (+); 
-- 없는 값 null
select jikwon_name, buser_name from jikwon inner join buser on buser_num=buser_no (+); 

2) Right Outer Join

  • 오른쪽에 있는 테이블의 모든 결과를 가져온 후 왼쪽 테이블의 데이터를 매칭하고, 매칭되는 데이터가 없는 경우 NULL을 표시한다.


1
2
3
select jikwon_name, buser_name from jikwon, buser where buser_num(+)=buser_no; 
-- 없는 값 null
select jikwon_name, buser_name from jikwon inner join buser on buser_num(+)=buser_no;

3) Full Outer Join

  • Left Outer Join + Right Outer Join. 양쪽 모두 조건이 일치하지 않는 것들까지 모두 결합하여 출력


1
2
3
select jikwon_name, buser_name from jikwon, buser where buser_num(+)=buser_no(+); -- X
select jikwon_name, buser_name from jikwon full join buser on buser_num=buser_no; 
-- 전부 다 출력

Inner Join

서로 연관된 내용만 출력

  • 표주SQL
  • select "column_name" from "table_name" INNER JOIN "table_name" on 조건
  • Oracle(권장X)
  • select "column_name" from "table_name","table_name" where 조건


1
2
3
4
select jikwon_name, buser_name from jikwon, buser where buser_num=buser_no; 
-- 오라클용 (다른데 가서 이렇게 쓰면 안될 수가 있다.)
select jikwon_name, buser_name from jikwon inner join buser on buser_num=buser_no; 
-- 표준SQL용

추가: 삼중조인

(1 + 2)Join 후 3과 Join하는 방식

1
2
3
4
5
6
7
-- (1 + 2)Join 후 3과 Join하는 방식
select jikwon_name, buser_name, gogek_name from jikwon, buser, gogek
where buser_num=buser_no and jikwon_no=gogek_damsano;

select jikwon_name, buser_name, gogek_name 
from jikwon inner join buser on buser_num=buser_no 
inner join gogek on jikwon_no=gogek_damsano;

Union

Join과 마찬가지로 테이블을 합치는 작업이지만 결과물을 상하위로 합치는 직렬 조합에 사용
Union은 전체 행에 대해 Distinct 작업이 수행되므로 전체 행의 값이 같은 경우 제거

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
-- union: 구조가 일치하는 두 개 이상의 테이블 자료 합쳐보기
create table pum1(bun int, pummok varchar2(10));
insert into pum1 values(1, '한라봉');
insert into pum1 values(2, '귤');
insert into pum1 values(3, '천혜향');
insert into pum1 values(50, '자몽');
select * from pum1;
drop table pum1;

create table pum2 (num int, sangpum varchar2(10));
insert into pum2 values(10, '사과');
insert into pum2 values(20, '배');
insert into pum2 values(30, '포도');
insert into pum2 values(40, '딸기');
insert into pum2 values(50, '자몽');
select * from pum2;

-- 합집합: 두 테이블을 합쳐서 보여준다. 
select bun, pummok from pum1
union
select num, sangpum from pum2;

-- 유니온하되, 중복 있게 보여준다.
select bun, pummok from pum1
union all
select num, sangpum from pum2;

-- 차집합: pum1-pum2. 자몽이 제외된다. 
select bun, pummok from pum1
minus
select num, sangpum from pum2;

-- 교집합: 두 테이블 사이에 중복되는 데이터만 반환
select bun, pummok from pum1
intersect
select num, sangpum from pum2;

그림 및 내용 참조: 거꾸로 바라본 세상 블로그
참조: 원본코드
코드에 문제가 있거나 궁금한 점이 있으면 wjddyd66@naver.com으로 Mail을 남겨주세요.

Categories:

Updated:

Leave a comment