평소에 아래와 같은 문제를 풀면서 JOIN 이라는 SQL 명령어를 많이 사용하고는 했는데 정확히 join이 뭔지 알아보고 싶어서 이 아티클을 적어본다.
https://school.programmers.co.kr/learn/courses/30/lessons/133027
무조건 join 만 쓰면 되는 줄 알았는데 알고보니 inner join, outer join, left join, right join ... 등 여러 조인 문이 있어서 앞으로 사용할떄도 햇갈리지 않게 확실하게 정리하고 가고자 한다.
일단 여러가지 outer join 에 대한 정보를 그림으로 나타내면 아래와 같다.

SELECT <열 목록>
FROM <첫 번째 테이블(LEFT 테이블)>
<LEFT | RIGHT | FULL> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
ON <조인 조건>
[WHERE 검색 조건]
LEFTRIGHTFULL을 통해 어떤식으로 OUTER JOIN을 할 지 정할 수 있다.
- left outer join : 왼쪽 테이블 값이 모두 출력된다.
- right outer join : 오른쪽 테이블 값이 모두 출력된다.
- full outer join : 왼쪽 또는 오른쪽 테이블 값이 모두 출력된다.
outer 를 생략하고 left join, right join, full join 으로 쓸 수도 있다.
SELECT <열 목록>
FROM <첫 번째 테이블>
INNER JOIN <두 번째 테이블>
ON <조인 조건>
[WHERE 검색 조건]
INNER 를 생략 할 수 있다.
SELECT *
FROM <첫 번째 테이블>
CROSS JOIN <두 번째 테이블>

SELECT <열 목록>
FROM <테이블> 별칭A
INNER JOIN <테이블> 별칭B
[WHERE 검색 조건]


1) LEFT OUTER JOIN
select *
from lol_feedbacks lf left outer join lol_users lu
on lf.id = lu.id;
결과:

왼쪽 테이블(lol_feedbacks) 과 오른쪽 테이블 (lol_users) 이 조건에 맞도록 열맞춤이 된다. 그리고 왼족 테이블의 크기에 맞게 행의 개수가 조정된다.
2) RIGHT OUTER JOIN
select *
from lol_feedbacks lf right outer join lol_users lu
on lf.id = lu.id;

오른쪽 테이블의 열의 개수에 맞게 조인된 테이블이 조정되며 왼쪽 테이블의 불일치 하는 조건의 열은 사라지는 것을 확인 할 수 있다.
3) FULL OUTER JOIN
select *
from lol_feedbacks lf left outer join lol_users lu
on lf.id = lu.id
UNION
select *
from lol_feedbacks lf right outer join lol_users lu
on lf.id = lu.id;

좌측 테이블과 우측 테이블 비교 시 우측 테이블만 가지고 있는 값이 없기 때문에 위와 같이 나타나지만 (left join 과 일치) 원래는 오른쪽에만 있는 데이터가 있으면 해당 데이터가 출력 되며 왼쪽 테이블이 null 로 채워진다.
select *
from lol_feedbacks lf inner join lol_users lu
on lf.id = lu.id

두 테이블을 비교해서 조건과 일치하는 열만 조회한다. 어떻게 보면 좌측 테이블이 우측 테이블을 포함하는 느낌이라 이전 right outer join 과 일치하게 나온다.
select *
from lol_feedbacks lf cross join lol_users lu

이전 join 들과 달리 조인 조건이 없어도 된다. (있으면 inner join 과 동일 결과 이경우) ( 4 x 5)
self join 이라는 키워드가 있는 것이 아니라 inner join 을 이용해서 self join을 구현 할 수 있다.select *
from lol_feedbacks lf1 inner join lol_feedbacks lf2;

5개의 열을 가진 테이블을 self join 해서 5 * 5 로 25개 가 나왔다. 또한 조건을 추가해서 아래와 같이 한 테이블의 두 열을 비교 가능하다.
select *
from lol_feedbacks lf1 inner join lol_feedbacks lf2
where lf1.satisfaction_score = lf2.satisfaction_score ;

만족도 점수가 같은 조건을 가진 열 들을 inner join 하는 코드로서
복사된 테이블 이므로 일치하는 열의 개수는 일단5개, 그리고 별점이 5점인 것 2개 4점인 것 2개가 존재하므로 이 열들의 조합으로4개이 들을 더해서 총 9개의 row 가 나오게 된다.

위처럼 9가지가 나오게 된다.
이미지 참고사이트 : https://hongong.hanbit.co.kr/sql-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95-joininner-outer-cross-self-join/