SQL JOIN 이해하기
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은 첫 번째 테이블과 두 번째 테이블에 있는 모든 값들이 나온다.