개발 공부 기록하기/02. DB & SQL

SQL JOIN 이해하기

lannstark 2019. 7. 27. 10:55

JOIN : 두 개 이상의 테이블이나 데이터베이스를 연결하여 검색하는 방법

보통 PK 또는 FK로 두 테이블을 연결함

Inner Join

교집합이라고 많이 설명한다. 여기서 교집합이라는 것은, 특정 조건에 맞는 행들만 포함시키고 그렇지 않은 행들은 제외시킨다는 뜻이다.

예를 들어, 두 테이블이 있다고 하자

  • 유저(user) 테이블

    id : PK
    name : 유저 이름
  • 자동차(car) 테이블

    id : PK
    user_Id : FK (유저 테이블)
    name : 자동차 이름

이 테이블에 다음과 같은 값들이 있다고 하자

  • 유저(user) 테이블

    (1, 김철수)
    (2, 홍길동)
    (3, 김영희)
    (4, 박상식)
  • 자동차(car) 테이블

    (1, 1, "SM3")
    (2, 1, "그렌져")
    (3, 2, "소나타")
    (4, 3, "모닝")

이때 SQL을 다음과 같이 작성하면

SELECT * FROM user INNER JOIN car ON user.id = car.user_id

다음과 같은 결과가 나온다.

user.id와 car.user_id가 같은 결과가 모두 나온 것이다! 그러니까 INNER JOIN은 우리가 생각하는 가장 일반적인 join, 조건이 맞으면 가져오는 join이라고 생각하면 쉽다.

INNER JOIN 정리

INNER JOIN 사용법은 이렇게 정리할 수 있다.

SELECT <열 목록>
FROM <첫 번째 테이블>
  INNER JOIN <두번째 테이블>
  ON <검색될 조건>

여기서 이제 무언가를 탐색하고 싶다면 WHERE 절을 붙일 수 있다.

SELECT * FROM user INNER JOIN car ON user.id = car.user_id
  WHERE user.name = "김철수";

결과는 이렇다.

 

Outer Join

OUTER JOIN에는 세 가지 종류가 있다. LEFT, RIGHT, FULL이다.

INNER JOIN을 이해했다면 OUTER JOIN도 쉽게 이해할 수 있다.

LEFT JOIN

SELECT <열 목록>
FROM <첫 번째 테이블>
  LEFT OUTER JOIN <두번째 테이블>
  ON <검색될 조건>

LEFT OUTER JOIN은 INNER JOIN의 결과에 첫 번째 테이블에 있는 모든 값들이 나온다

SELECT * FROM user LEFT OUTER JOIN car ON user.id = car.user_id;

당연히 첫 번째 테이블에 있는 결과가 나올 때 두 번째 테이블과 겹치는 부분이 없으므로 그 부분은 모두 null로 나오게 된다.

 

Q. 만약 왼쪽과 오른쪽 테이블을 바꾼다면?

반대로 앞 쪽에 있는 테이블의 결과가 모두 나오게 된다.

car는 user를 FK로 참조하고 있으므로 추가적으로 나올 row는 없기 때문에 이런 결과가 나오게 될 것이다.

 

* LEFT OUTER JOIN 대신 LEFT JOIN이라고 할 수도 있다.

 

RIGHT JOIN

SELECT <열 목록>
FROM <첫 번째 테이블>
  RIGHT OUTER JOIN <두번째 테이블>
  ON <검색될 조건>

RIGHT JOIN은 LEFT JOIN과 유사한데, 두 번째 테이블에 있는 모든 값들이 나온다.

그러니까 두 sql의 결과는 같게 되는 것이다.

SELECT * FROM user LEFT OUTER JOIN car ON user.id = car.user_id;
SELECT * FROM car RIGHT OUTER JOIN user ON user.id = car.user_id;

 

FULL JOIN

SELECT <열 목록>
FROM <첫 번째 테이블>
  RIGHT OUTER JOIN <두번째 테이블>
  ON <검색될 조건>

FULL JOIN은 첫 번째 테이블과 두 번째 테이블에 있는 모든 값들이 나온다.