SQL 여러가지 JOIN 이해하기

‍박태우·2024년 9월 13일

nbc_spring

목록 보기
16/28

평소에 아래와 같은 문제를 풀면서 JOIN 이라는 SQL 명령어를 많이 사용하고는 했는데 정확히 join이 뭔지 알아보고 싶어서 이 아티클을 적어본다.

https://school.programmers.co.kr/learn/courses/30/lessons/133027

무조건 join 만 쓰면 되는 줄 알았는데 알고보니 inner join, outer join, left join, right join ... 등 여러 조인 문이 있어서 앞으로 사용할떄도 햇갈리지 않게 확실하게 정리하고 가고자 한다.

OUTER JOIN (외부 조인)

일단 여러가지 outer join 에 대한 정보를 그림으로 나타내면 아래와 같다.

  • OUTER JOIN 은 두 테이블 중에 어느 한쪽에만 데이터가 있어도 조회하는 구문이다.
SELECT <열 목록>
FROM <첫 번째 테이블(LEFT 테이블)>
    <LEFT | RIGHT | FULL> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
     ON <조인 조건>
[WHERE 검색 조건]

LEFT RIGHT FULL 을 통해 어떤식으로 OUTER JOIN을 할 지 정할 수 있다.

  • left outer join : 왼쪽 테이블 값이 모두 출력된다.
  • right outer join : 오른쪽 테이블 값이 모두 출력된다.
  • full outer join : 왼쪽 또는 오른쪽 테이블 값이 모두 출력된다.

참고 : mySQL 에서는 outer 를 생략하고 left join, right join, full join 으로 쓸 수도 있다.

INNER JOIN (내부 조인)

  • inner join 을 그림으로 보면 아래와 같다.

  • INNER JOIN 은 두 테이블을 조인 할 때, 두 테이블에 모두 지정된 열의 데이터가 있어야 한다.
SELECT <열 목록>
FROM <첫 번째 테이블>
    INNER JOIN <두 번째 테이블>
    ON <조인 조건>
[WHERE 검색 조건]

마찬가지로 INNER JOIN 은 JOIN 처럼 INNER 를 생략 할 수 있다.

CROSS JOIN

  • cross join 은 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인 시키는 기능으로서, 결과로 나오는 전체 행 개수는 각 테이블의 행 개수를 곱한 것과 같다. (카테시안 곱 : CARTESIAN PRODUCT)

SELECT *
FROM <첫 번째 테이블>
    CROSS JOIN <두 번째 테이블>

SELF JOIN

  • 자기 자신과 join 하므로 1개의 테이블을 이용하여 join 을 한다.

  • SELF JOIN을 통해 한 테이블 내의 두개의 다른 행을 비교 할 수 있다.
SELECT <열 목록>
FROM <테이블> 별칭A
    INNER JOIN <테이블> 별칭B
[WHERE 검색 조건]

실제 데이터에 사용해보기

  • lol_feedbacks 테이블

  • lol_users 테이블

1) OUTER JOIN 사용하기

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

  • mysql 에서는 위 문법을 지원하지 않아서 아래와 같이 left join 과 right join (outer) 를 UNION 연산을 통해 구현 가능하다.
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 로 채워진다.

2) INNER JOIN 사용하기

select *
from lol_feedbacks lf inner join lol_users lu 
on lf.id = lu.id

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

3) CROSS JOIN 사용하기

select *
from lol_feedbacks lf cross join lol_users lu 

이전 join 들과 달리 조인 조건이 없어도 된다. (있으면 inner join 과 동일 결과 이경우) ( 4 x 5)

4) SELF JOIN 사용하기

  • 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/

profile
잘 부탁드립니다.

0개의 댓글