JOIN
데이터베이스 내 여러 테이블에서 가져온 데이터를 조합하여 하나의 테이블로 표현한다. 방식에 따라 INNER JOIN, LEFT JOIN, RIGHT JOIN으로 구분한다.
JOIN은 크게 아래와 같은 방식으로 사용하며, ON 절의 조건에 따라 여러 테이블을 하나의 테이블로 합쳐 표현할 수 있다.
<기준 테이블>
JOIN <참조 테이블>
ON <조건>
INNER JOIN
ON 절을 만족하는 데이터만을 가져오며, 두 테이블 모두 값이 있는 레코드를 선택한다. 따라서 기준 테이블과 참조 테이블의 순서가 바뀌어도 결과에 영향을 미치지 않는다.
MySQL에서 JOIN, INNER JOIN, CROSS JOIN 모두 INNER JOIN을 의미한다.
사용법
SELECT *
FROM table1
INNER JOIN table2
ON table1.key = table2.key;
예시 )
아래와 같이 stand, order 테이블이 존재한다고 하자.
TABLE stand
HOUR |
7 |
8 |
9 |
10 |
11 |
12 |
TABLE order
HOUR | COUNT |
07 | 3 |
08 | 1 |
09 | 1 |
10 | 2 |
INNER JOIN 결과 (key = HOUR)
HOUR 컬럼을 기준으로 JOIN한 결과는 아래와 같다.
SELECT o.HOUR, COUNT
FROM stand as s
JOIN order as o
ON s.HOUR = o.HOUR;
HOUR | COUNT |
07 | 3 |
08 | 1 |
09 | 1 |
10 | 2 |
order 테이블 HOUR 컬럼 중에는 11, 12 값이 없어 JOIN 결과에 포함되지 않았다.
LEFT JOIN
첫번째 테이블을 기준으로 두 번째 테이블을 조합한다. ON 절을 만족하지 않는 경우, 첫 번째 테이블의 필드 값은 그대로 가져오나, 두 번째 테이블의 필드 값은 NULL로 표시된다.
사용법
SELECT *
FROM table1
LEFT JOIN table2
ON table1.key = table2.key;
예시 )
위의 stand, order 테이블을 이어서 사용한다.
LEFT JOIN 결과 (key = HOUR)
SELECT s.HOUR, COUNT
FROM stand as s
LEFT JOIN order as o
ON s.HOUR = o.HOUR;
HOUR | COUNT |
07 | 3 |
08 | 1 |
09 | 1 |
10 | 2 |
11 | |
12 |
order 테이블 HOUR 컬럼 중에는 11, 12 값이 없어 JOIN 결과의 COUNT 컬럼이 NULL로 처리되었다.
RIHGT JOIN
LEFTJOIN과 반대로 두번째 테이블을 기준으로 첫 번째 테이블을 조합한다. ON 절을 만족하지 않는 경우, 두번째 테이블의 필드 값은 그대로 가져오나, 첫 번째 테이블의 필드 값은 NULL로 표시된다.
사용법
SELECT *
FROM table1
RIGHT JOIN table2
ON table1.key = table2.key;
예시 )
위의 stand, order 테이블을 이어서 사용한다.
RIGHT JOIN 결과 (key = HOUR)
SELECT s.HOUR, COUNT
FROM stand as s
RIGHT JOIN order as o
ON s.HOUR = o.HOUR;
HOUR | COUNT |
07 | 3 |
08 | 1 |
09 | 1 |
10 | 2 |
JOIN 요약
JOIN은 간단히 아래의 이미지처럼 이해할 수 있다.
단, MySQL의 경우 FULL OUTER JOIN(하단의 두 개)을 지원하지 않는다.
참고 문서
https://www.w3schools.com/mysql/mysql_join_inner.asp
https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins