두 개 이상의 테이블에 존재하는 데이터를 하나의 결과(행,Result Set)으로 조회하기위한 방법
selection condition과 join condition의 차이
직원 ID가 1인 직원인것과 동시에 직원의 부서번호와 부서테이블의 ID가 같은 데이터를 구하기 위한 쿼리
from 절에는 테이블들만 나열하고, where절에 join 조건을 명시하는 방식
where절에 selection condition(select의 조건)과 join condition이 같이 있기 때문에 가독성이 떨어진다. (구식, 사용되지 않는다.)
from 절에 JOIN 키워드와 함께 joined table들을 명시하는 방식
from 절에서 ON뒤에 join condition이 명시된다.
JOIN 테이블 명 ON 조건(join condition)
가독성이 좋다.
INNER 키워드는 생략이 가능하여 JOIN 키워드만 작성시 묵시적으로 inner join이 실행된다.
from E join D on E.dept_id = D.id
조인의 기준이 되는 column인 dept_id에 데이터가 존재하지 않고 Department 테이블의 id 중 1002에 속하는 직원이 없는 경우
결과 : 매칭이 되지 않은 SIMON의 데이터가 출력되지 않고, Department 테이블의 id값 1002 row가 결과값으로 나오지 않는다.
Inner join은 두 테이블에서 join condition을 만족하는 tuple들로 ResultSet을 만드는 join이다.
join condition에서 null값을 가지는 tuple은 ResultSet에 포함되지 못한다.
두 테이블에서 join condition을 만족하지 않는 tuple들도 ResultSet에 포함하는 join
LEFT 또는 RIGHT, FULL 키워드를 작성할 경우 묵시적으로 Outer join이 실행된다.
inner join과 outer join의 차이는 inner join은 join condition을 만족하는 row만 결과를 보여주지만, outer join은 join condition을 만족하지 않는 row들도 결과를 보여준다.
LEFT : 결과값을 출력하기 위한 기준 테이블이 왼쪽 테이블이다.
기준이 되는 테이블인 employee 테이블의 SIMON의 데이터는 정상적으로 출력되지만, department 테이블의 테이터는 모두 null로 출력된다.
RIGHT : 기준 테이블이 오른쪽 테이블이다.
오른쪽 테이블의 값들은 정상적으로 출력되지만, join condition을 만족하지 못한 경우 왼쪽테이블의 데이터들은 모두 null로 출력된다.
Full OUTER JOIN : MySQL의 경우 FULL OUTER JOIN을 지원하지 않는다.
Postgresql은 FULL OUTER JOIN이 가능하다.
join condition을 만족한 데이터들은 하나의 row로 출력되지만, 조건을 만족하지 않는 데이터들은 서로 다른row로 출력이된다.
두 테이블에서 join condition으로 사용되는 column명이 동일한 경우 컬럼을 각각명시하여 join condition으로 사용할 수 있다.
using을 사용할 경우 column명을 한번만 작성해도 된다.
from E join D using(dept_id)
ResultSet도 변경된다. join condition으로 사용되는 컬럼이 앞쪽으로 빠지게 되고, 한번만 출력된다.
from Table1 CROSS JOIN Table2
join condition을 작성하지 않는다.
두테이블에서 tuple pair로 만들수 있는 모든 조합을 반환한다.
Employee 테이블의 row * Department 테이블의 row
6 * 5 = 30개의 row가 표현된다.
MySQL의 경우 크로스 조인과 이너조인이 같은 의미로 사용된다.
즉, join condition을 작성한것을 판단하여 join을 실행한다.
table이 자기 자신에게 join하는 경우
첫번째 join condition결과를 포함하여 출력하기 위해, 두번째 join condition에는 LEFT join을 사용한다.
두번째 join condition을 LEFT 조인으로 하지 않는 경우 Employee 테이블의 dept_id가 null이면 첫번째 join condition을 충족시켜도 ResultSet으로 출력되지 않는다.