본문 바로가기

데이터베이스

INNER JOIN과 OUTER JOIN

[JOIN]

일반적인 경우 행들은 PRIMARY KEY(PK)나 FOREIGN KEY(FK) 값의 연관에 의해 JOIN이 성립된다.

하지만 어떤 경우에는 이러한 PK, FK의 관계가 없어도 논리적인 값들의 연관만으로 JOIN이 성립 가능하다.

FROM 절에 여러 테이블이 나열되더라도 SQL에서 데이터를 처리할 때는 단 두 개의 집합 간에만 조인이 일어난다는 것이다.

테이블의 조인 순서는 옵티마이저에 의해서 결정된다.

https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

Table A
id      userId  name
1	id001	youn
2	id002	life
3	id003	mysql
4	id004	oracle
5	id005	databasel
--
Table B
id      userId  nickName
1	id001	nickYoun
2	id002	nickLife
4	id004	nickOracle
6	id006   nickDuck
--

[INNER JOIN]

A INNER JOIN B를 하게 되면 A테이블과 B테이블의 교집합을 나타낸다.

select *
from a inner join b
	on a.id = b.id;
    
-- 결과
id      userId  name    id      userId  nickName
1	id001	youn	1	id001	nickYoun
2	id002	life	2	id002	nickLife
4	id004	oracle	4	id004	nickOracle

[OUTER JOIN]

A OUTER JOIN B를 하게되면 A테이블과 B테이블의 합집합을 나타낸다.

LEFT OUTER JOIN

select *
from a  left outer join b
	on a.id = b.id;

-- 결과
id      userId  name      id    userId  nickName
1	id001	youn	  1	id001	nickYoun
2	id002	life	  2	id002	nickLife
3	id003	mysql	  null  null    null		
4	id004	oracle	  4	id004	nickOracle
5	id005	databasel null  null    null

RIGHT OUTER JOIN

select *
from a  right outer join b
	on a.id = b.id;
    
--결과
id      userId  name    id      userId  nickName
1	id001	youn	1	id001	nickYoun
2	id002	life	2	id002	nickLife
4	id004	oracle	4	id004	nickOracle
null    null    null	6	id006	nickDuck

FULL OUTER JOIN

MySQL에서는 FULL OUTER JOIN을 지원하지 않아 LEFT OUTER JOIN 결과와 RIGHT OUTER JOIN 결과를 UNION 해주어야 한다.

A에는 있는데 B에 없는 id가 3, 5인 부분은 null로 조회됩니다.

B에는 있는데 A에 없는 id가 6인 부분은 null로 조회됩니다.

select *
from a  left outer join b
	on a.id = b.id
union
select *
from a right outer join b
	on a.id= b.id;

-- 결과
id      userId  name      id    userId   nickName
1	id001	youn	  1	id001	nickYoun
2	id002	life	  2	id002	nickLife
3	id003	mysql     null   null   null
4	id004	oracle	  4	id004	nickOracle
5	id005	databasel null   null   null			
null    null    null	  6	id006	nickDuck