서비스들중에는 테이블을 참조 안하고 단일테이블로만 이루어져있는 테이블은 아마 거의 없을 것이다. 대부분 테이블을 JOIN하여 2개이상 사용하는 것이 대부분이다.
join을 사용하는 이유는 정규화와 관련있는데 한마디로 편하게 쓰기위해 join을 사용한다. 만약 join을 사용안하고 테이블 관리를 한다면 불필요한 작업이 많아지게 되어 나중에 문제가 생길 수 있다.

JOIN에는 여러가지 종류가 있는데 INNER, LEFT, RIGHT, FULL을 설명할 것이다, 예시에 사용할 테이블은 이렇게 사용할 것이다.
member table
CREATE TABLE `member` (
`seq` int(11) NOT NULL AUTO_INCREMENT COMMENT '일련번호',
`age` int(11) DEFAULT NULL COMMENT '나이',
`name` varchar(255) DEFAULT NULL COMMENT '이름',
PRIMARY KEY (`seq`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4;
room table
CREATE TABLE `room` (
`seq` int(11) NOT NULL AUTO_INCREMENT COMMENT '일련번호',
`member_id` int(11) DEFAULT NULL COMMENT '멤버번호',
`room_name` varchar(255) DEFAULT NULL COMMENT '방이름',
PRIMARY KEY (`seq`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4;
테이블 데이터

두 테이블의 공통된 부분만 추출한다.
# INNER JOIN
select
r1.member_id
, r1.room_name
, m.age
, m.name
from room r1
inner join member m
on m.seq = r1.member_id
결과

만약 on 조건을 빼고 SQL을 실행하면 총 5 * 6 즉 30줄이 출력된다. 이 것은 CROSS JOIN과 동일하게 동작한다.
LEFT OUTER JOIN은 쿼리문을 기준으로 LEFT 왼쪽에 있는 테이블을 중심으로 출력을 하는데 왼쪽 테이블 전체와 on 조건에 해당하는 값을 출력한다.
# LEFT OUTER JOIN
select
r1.member_id
, r1.room_name
, m.age
, m.name
from room r1
LEFT join member m
on m.seq = r1.member_id

LEFT JOIN은 쿼리문을 기준으로 LEFT 왼쪽에 있는 테이블을 중심으로 출력을 하는데 왼쪽 테이블 전체와 on 조건에 해당하는 값중에서 오른쪽에 있는 테이블에 포함하는 값은 제외한다.
# LEFT JOIN
select
r1.member_id
, r1.room_name
, m.age
, m.name
from room r1
LEFT join member m
on m.seq = r1.member_id
where m.seq is null

RIGHT OUTER JOIN은 쿼리문을 기준으로 RIGHT 오른쪽에 있는 테이블을 중심으로 출력을 하는데 오른쪽 테이블 전체와 on 조건에 해당하는 값을 출력한다.
# RIGHT OUTER JOIN
select
r1.member_id
, r1.room_name
, m.age
, m.name
from room r1
RIGHT join member m
on m.seq = r1.member_id

RIGHT JOIN은 쿼리문을 기준으로 RIGHT 오른쪽에 있는 테이블을 중심으로 출력을 하는데 오른쪽 테이블 전체와 on 조건에 해당하는 값중에서 왼쪽에 있는 테이블에 포함하는 값은 제외한다.
# RIGHT JOIN
select
r1.member_id
, r1.room_name
, m.age
, m.name
from room r1
RIGHT join member m
on m.seq = r1.member_id
where r1.member_id is null

FULL JOIN은 결론부터 말하면 mariaDB에서 시도할경우 사용할 수 없다고 에러가 나온다.

하지만 UNION문을 활용해 같은 결과를 내게 할 수는 있다.
FULL OUTER JOIN은 대상으로 삼는 테이블의 공통되는 부분과 공통되지 않는 부분을 조회한다. 쉽게 생각하면 FULL OUTER JOIN은 다음과 같이 정리가 가능하다.
INNER JOIN + LEFT JOIN + RIGHT JOIN = FULL OUTER JOIN
# FULL OUTER JOIN
select
r1.member_id
, r1.room_name
, m.age
, m.name
from room r1 left join member m on r1.member_id = m.seq
union
select
r1.member_id
, r1.room_name
, m.age
, m.name
from room r1 right join member m on r1.member_id = m.seq

FULL JOIN은 대상으로 삼는 테이블의 공통되지 않는 부분을 조회한다. 쉽게 생각하면 FULL JOIN은 다음과 같이 정리가 가능하다.
LEFT JOIN + RIGHT JOIN = FULL JOIN
select
r1.member_id
, r1.room_name
, m.age
, m.name
from room r1 left join member m on r1.member_id = m.seq
where m.seq is null
union all
select
r1.member_id
, r1.room_name
, m.age
, m.name
from room r1 right join member m on r1.member_id = m.seq
where r1.member_id is null

(위의 SQL문에서는 union all로 했는데 만약 union으로 했으면 중복제거가 되었기 때문에 일부러 union all을 사용했다. union으로 작성했다면 2줄이 나왔지만 공통되는 조건의 데이터가 제외된다는 점은 같다.)
https://kitty-geno.tistory.com/59