JOIN
은 두개 이상의 테이블을 결합한 것이다.
INNER JOIN
은 교집합으로 두 개의 테이블에서 공통된 요소들을 통해 결합하는 조인 방식이다.
INNER JOIN 문법
SELECT column1, column2, ... FROM celeb INNER JOIN tableB ON tableA.column = tableB.column WHERE condition;
Example: k_drama에 출연한 celebrity를 기준으로 celebrity 테이블과 k_drama 테이블을 INNER JOIN하기
SELECT celebrity.id, celebrity.name, k_drama.id, k_drama.host
FROM celebrity
INNER JOIN k_drama
ON celebrity.name = k_drama.host;
왼쪽의 결과값은 celebrity 테이블에서 가져온 데이터이고 오른쪽의 결과값은 k_drama 테이블에서 가져온 데이터이다.
참고로 여기서 INNER JOIN은 수평으로 데이터를 결합시키고 UNION은 수직으로 데이터를 결합시킨다.
- 2개 이상의 테이블을 사용하면 이름이 같은 열(column)에 한해서는 어느 테이블에 있는 column인지
tablename.column
와 같이 명시를 꼭 해줘야한다.- 해당 테이블에만 존재하는 열(column)은 어느 테이블인지 명시를 안해줘도 된다.
- 하지만, 2개 이상의 테이블을 사용 시 해깔릴 위험이 있기 때문에 각 테이블 이름을 써주는게 좋다.
LEFT JOIN
은 두 개의 테이블에서 공통 영역을 포함해 왼쪽 테이블의 다른 데이터를 포함하는 조인 방식이다.
LEFT JOIN 문법
SELECT column1, column2, ... FROM tableA LEFT JOIN tableB ON tableA.column = tableB.column WHERE condition;
Example: k_drama에 출연한 celebrity를 기준으로 celebrity 테이블과 k_drama 테이블을 LEFT JOIN하기
SELECT celebrity.id, celebrity.name, k_drama.id, k_drama.host
FROM celebrity
LEFT JOIN k_drama
ON celebrity.name = k_drama.host;
RIGHT JOIN
은 'LEFT JOIN'과 반대로, 반대의 두개의 테이블에서 공통 영역을 포함해 오른쪽 테이블의 다른 데이터를 포함하는 조인 방식이다.
RIGHT JOINT 문법
SELECT column1, column2, ... FROM tableA RIGHT JOIN tableB ON tableA.column = tableB=column WHERE condition;
Example: k_drama에 출연한 celebrity를 기준으로 celebrity 테이블과 k_drama 테이블을 RIGHT JOIN하기
SELECT celebrity.id, celebrity.name, k_drama.id, k_drama.host
FROM celebrity
RIGHT JOIN k_drama
ON celebrity.name = k_drama.host;
FULL OUTER JOIN
은 합집합으로 두개의 테이블에서 공통 영억을 포함하여 양쪽 테이블의 다른 영역을 모두 포함하는 조인 방식이다.
FULL OUTER JOIN 문법
SELECT column1, column2, ... FROM tableA FULL OUTER JOIN tableB ON tableA.column = tableB=column WHERE condition;
Example: k_drama에 출연한 celebrity를 기준으로 celebrity 테이블과 k_drama 테이블을 FULL OUTER JOIN하기
SELECT celebrity.id, celebrity.name, k_drama.id, k_drama.host
FROM celebrity
FULL OUTER JOIN k_drama
ON celebrity.name = k_drama.host;
위와 같이 query를 진행 시 syntax 에러(문법 에러)가 난다. 그 이유는 현재 MySQL에서는 FULL OUTER JOIN을 지원하지 않으므로 생기는 에러다.
따라서 FULL OUTER JOIN 대신 다음과 같은 query를 사용할 수 있다.
SELECT column1, column2, ...
FROM tableA
LEFT JOIN tableB
ON tableA.column = tableB.column
UNION
SELECT column1, column2, ...
FROM tableA
RIGHT JOINT tableB
ON tableA.column = tableB.column
WHERE condition;
Example: k_drama에 출연한 celebrity를 기준으로 celebrity 테이블과 k_drama 테이블을 FULL OUTER JOIN하기
SELECT celebrity.id, celebrity.name, k_drama.id, k_drama.host
FROM celebrity
LEFT JOIN k_drama
ON celebrity.name = k_drama.host
UNION
SELECT celebrity.id, celebrity.name, k_drama.id, k_drama.host
FROM celebrity
RIGHT JOINT k_drama
ON celebrity.name = k_drama.host;
SELF JOIN
은 가장 많이 사용되는 조인 방식으로 문법상 다르지만 INNER JOIN과 같은 결과값을 가져온다.
SELF JOIN 문법
SELECT column1, column2, ... FROM tableA, tableB, ... WHERE condition; /* SELF JOIN의 조건은 WHERE 절에 명시되며, 이 조건에 따라 테이블 내의 행이 서로 비교된다. */
Example 1: k_drama에 출연한 celebrity를 기준으로 celebrity 테이블과 k_drama 테이블을 SELF JOIN하기
SELECT celebrity.id, celebrity.name, k_drama.id, k_drama.host
FROM celebrity, k_drama
WHERE celebrity.name = k_drama.host;
오늘은 JOIN 문에 대해서 배웠다. 오랜만에 교집합과 합집합의 다이어그램을 보아서 반가웠다. 반가움을 뒤로한 채 문제들이 점점 뒤로 갈수록 꼬여서 나온다..ㅋㅋㅋ 그래도 아직은 혼자서 풀만 하다.