포스트

초간단 실습으로 Inner Join과 Outer Join 살펴보기

초간단 실습을 해보며 MySQL에서 Inner JoinOuter Join을 이해해보자!

예시 테이블

다음 예시 데이터들을 확인하여, 아래에 있을 실습에 착오가 없길 바란다.

Employee Table

namedepartmentID
문성훈1
김현수5
허태영2
송훈석2
조수호4
정지용NULL

Department Table

departmentIDname
1소프트웨어개발팀
2보안연구팀
3경호팀
4스팀
5보안파견팀
6 
예제 SQL 확인(DDL/DML)

MySQL로 작성되었음.

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
create table Department
(
    id             int auto_increment
        primary key,
    departmentName varchar(10) null comment '부서명'
)
    comment '부서 테이블';


create table Employee
(
    id           int auto_increment
        primary key,
    name         varchar(10) null comment '직원이름',
    departmentId int         null comment '부서 id'
);

INSERT INTO join_test.Department (id, departmentName) VALUES (1, '소프트웨어개발팀');
INSERT INTO join_test.Department (id, departmentName) VALUES (2, '보안연구팀');
INSERT INTO join_test.Department (id, departmentName) VALUES (3, '경호팀');
INSERT INTO join_test.Department (id, departmentName) VALUES (4, '스팀');
INSERT INTO join_test.Department (id, departmentName) VALUES (5, '보안파견팀');
INSERT INTO join_test.Department (id, departmentName) VALUES (6, NULL);


INSERT INTO join_test.Employee (id, name, departmentId) VALUES (1, '문성훈', 1);
INSERT INTO join_test.Employee (id, name, departmentId) VALUES (2, '김현수', 5);
INSERT INTO join_test.Employee (id, name, departmentId) VALUES (3, '허태영', 2);
INSERT INTO join_test.Employee (id, name, departmentId) VALUES (4, '송훈석', 2);
INSERT INTO join_test.Employee (id, name, departmentId) VALUES (5, '조수호', 4);
INSERT INTO join_test.Employee (id, name, departmentId) VALUES (6, '정지용', NULL);

SQL Join

SQL에서 Join은 크게 두가지가 있다.

Inner Join

200x200
Inner Join은 두 집합에서 공통적으로 포함하고 있는 부분만 조인하는 방식이다.
따라서 두 테이블에서 연관된 ROW 들만 결과로 출력된다.

실습

사용법 : inner Join 혹은 Join을 From절 이후에 추가하면 된다.

1
2
3
4
5
6
SELECT  
  e.NAME,  
  d.departmentname  
FROM  
  Employee e  
  INNER JOIN Department d ON d.id = e.departmentId; -- 이렇게 !

#예시 테이블을 확인해보면 정지용의 부서IDNULL임을 확인 할 수 있다. Inner Join 은 두 관계에서 연관된 데이터만 가져오므로, 실행결과에 부서 ID 가 없는 (== 부서 테이블과 연관 없는) 정지용 직원 ROW 는 포함되지 않는다.

namedepartmentName
문성훈소프트웨어개발팀
김현수보안파견팀
허태영보안연구팀
송훈석보안연구팀
조수호스팀
  • 연상법 : 두 원이 있고, Inner니깐 안이 채워짐 => 교집합

Outer Join

교집합이었던 Inner Join 과 달리 Outer Join은 합집합을 의미한다.
Outer Join을 그림으로 나타내면 좀 다양하지만… 대표적인 것 3가지만 그려보았다. 350x350

Join 다음 명시해주는 테이블이 그림에서 의미하는 B 라고 생각하면 된다.

  • 연상법 : 두 원이 있고, Outer니깐 바깥쪽 색이 칠해짐 => 합집합

Left Outer Join

$A\cup B$ 의 결과를 $A$ 기준으로 표현하는 것이다.

$Employee \cup Department$ 를 Employee 기준으로 표현하게되면, Department를 가지지 않는 사람들도 실행 결과에 나타낼 수 있다.

실습

1
2
3
4
5
6
SELECT  
  e.NAME,  
  d.departmentname  
FROM  
  Employee e  
  LEFT OUTER JOIN Department d ON d.id = e.departmentId; -- 이렇게 !

결과 :

namedepartmentName
문성훈소프트웨어개발팀
김현수보안파견팀
허태영보안연구팀
송훈석보안연구팀
조수호스팀
정지용null

부서 정보를 가지지않은 정지용도 검색되었다.

Right Outer Join

$A\cup B$ 의 결과를 $B$ 기준으로 표현하는 것이다.

실습

아까 예시에서 A, B를 바꾸고 Right Outer Join으로 실습을 진행했다.

1
2
3
4
5
6
SELECT  
    e.NAME,    
	d.departmentname
FROM
    Department d -- 변경
    RIGHT JOIN Employee e ON d.id = e.departmentId; -- 변경

결과도 이전 실습과 똑같다 : (주의 : A, B를 바꿨기 때문에 결과가 Left Outer Join과 똑같은 거임)

namedepartmentName
문성훈소프트웨어개발팀
김현수보안파견팀
허태영보안연구팀
송훈석보안연구팀
조수호스팀
정지용null

Full outer join

단순한 두 개의 테이블의 합집합이다. MySQL에선 지원하지 않는다.
MySQL에서 사용하려면, Left Outer JoinRight Outer Join을 합쳐서 사용해야한다. 쿼리간 결과를 합칠땐 #UNION 을 사용한다.

1
2
3
4
5
6
7
8
9
10
11
SELECT  
    *  
FROM  
    Employee e  
LEFT OUTER JOIN Department d on d.id = e.departmentId  
UNION -- 여기  
SELECT  
    *  
FROM  
    Employee e  
RIGHT OUTER JOIN Department d on d.id = e.departmentId

실행결과 :

idnamedepartmentIdiddepartmentName
1문성훈11소프트웨어개발팀
2김현수55보안파견팀
3허태영22보안연구팀
4송훈석22보안연구팀
5조수호44스팀
6정지용nullnullnull
nullnullnull3경호팀
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

Comments powered by Disqus.