우리는 관계형 데이터베이스를 설계할 때 중복을 최소화하여 설계를 한다.
그런데 만약 우리가 데이터를 가져올 때 하나의 테이블이 아니라 여러 개의 테이블에서
데이터를 가져와야하는 경우는 어떻게 해야할까?
Join을 사용하여 여러 테이블에서 데이터를 가져온다.
Join의 종류에는 inner join, left join, right join, full outer join이 있다.
위 그림은 Join의 종류를 나타내준 그림이다. 위와 같이 벤다이어그램으로 Join을 생각하면 쉽게 이해할 수 있다.
inner join을 벤다이어그램으로 나타내면 교집합이다.
쿼리 문법은
테이블1 inner join 테이블2 on 조건;
이라는 형식으로 나타낸다.
만약 A와 B 테이블 두 개에서 userId가 같은 데이터들을 뽑아오고 싶으면 다음과 같이 쿼리문을 작성하면 된다.
SELECT *
FROM
A inner join B
on A.userId = B.userId;
라는 식으로 쿼리를 작성하면 된다.
Left join은 벤다이어그램으로 생각하면 A와 B 집합이 있을 때 A 집합을 나타낸다고 생각하면 된다.
테이블1 left join 테이블2 on 조건;
이라는 형식으로 쿼리문을 작성하면 된다.
만약 게시물
테이블에서 해당 게시물의 게시물 사진
데이터를 가지고 오고 싶다고 생각을 해보자.
편의상 게시물
테이블을 A
라고 생각해보고 게시물 사진
테이블을 B
라고 생각해보자.
이때, 게시물들은 사진이 존재하는 게시물들도 있지만 사진이 없는 게시물
들 역시 존재한다.
따라서 B
에서 불러오는 데이터의 값은 없을 수도 있다.
이런 경우 left join을 사용한다.
SELECT *
FROM
A left join B
on A.postId = B.postId;
라는 형식으로 데이터를 가져오면 된다.
만약, 사진이 없는 게시물들만 불러오고 싶으면 어떻게 해야할까?
SELECT *
FROM
A left join B
on A.postId = B.postId
WHERE B.postId IS NULL;
이라는 형식으로 쿼리를 짜면 된다
Right join은 left join과 방향만 달라진 것이라고 생각하면 된다.
위의 예시에서 테이블 A와 B의 위치만 바꾸면 된다.
FULL OUTER JOIN은 RIGHT JOIN과 LEFT JOIN의 결과를 합한 것과 같다. 하지만, MySQL
에서는 full outer join을 지원하지 않아 right join
과 left join
을 합한것으로 쿼리를 짜야한다.