회사 정보 테이블 스키마
SELECT D.name
FROM employee AS E, department AS D
WHERE E.id = 1 and E.dept_id = D.id;
SELECT D.name
FROM employee AS E JOIN department AS D ON E.dept_id = D.id
WHERE E.id = 1;
두 테이블에서 join condition을 만족하는 튜플들로 result table을 만드는 join
두 table에서 join condition을 만족하지 않는 tuple들도 result table에 포함하는 join
FROM table1 LEFT [OUTER] join table2 ON join_condition
-> 조건에 만족하지 않는 왼쪽(table1)테이블의 튜플도 포함.
FROM table1 RIGHT [OUTER] join table2 ON join_condition
-> 조건에 만족하지 않는(table2)테이블의 튜플도 포함.
FROM table1 FULL [OUTER] JOIN table2 ON join_condition
-> 조건에 만족하지 않는 각 테이블의 튜플도 포함.
(mysql에서는 FULL OUTER JOIN을 지원하지 않음.)
Ex(Left outer join)
SELECT *
FROM employee E LEFT OUTER JOIN department D ON E.dept_id = D.id;
--> result table
Simon의 경우 join condition에 부합하지 않지만 LEFT JOIN이기 때문에 result table에 포함됨, 이때 E의 속성은 기존 속성 그대로 가져오고 D에 대한 속성은 모두 NULL로 처리.
equi join
join contion에 = 를 사용하는 join
using 키워드
- 두 테이블이 equi join을 할때 join하는 속성의 이름이 같을때 사용할 수 있는 키워드
- EX : department 테이블의 id 속성을 dept_id로 변경하면, 다음과 같은 쿼리문으로 바꿀 수 있음
SELECT *
FROM employee E INNER JOIN department D USING (dept_id);
--> result
같은 이름의 속성은 result table에서 using속성으로 한번만 표시됨
natural join
- 두 테이블에서 같은 이름을 가지는 모든 속성 쌍에 대해 equi join을 수행하는 join
- join condition을 따로 명시하지 않음
- FROM table1 NATURAL Join table2
- EX: 아래 두 쿼리문은 동일한 의미를 가짐
SELECT *
FROM employee E NATURAL INNER JOIN department D;
SELECT *
FROM employee E INNER JOIN department D ON E.dept_id = D.dept_id AND E.name = D.name;
cross join
- 두 테이블의 tuple pair로 만들 수 있는 모든 조합(= Cartesian product)을 result table로 반환함
- join condition이 없음
- implicit cross join : FROM table1, table2
- explicit cross join : FROM table1 CROSS JOIN table2
- EX :
SELECT *
FROM employee CROSS JOIN department; (explicit)
SELECT *
FROM employee, department (implicit)
-> result table
mysql 에서 cross join
- mysql에서는 cross join == inner join == join 임
- CROSS JOIN에 ON(or USING)을 사용하면 INNER 방식으로 동작함
- INNER JOIN(or JOIN)이 ON(or USING) 없이 사용되면 CROSS JOIN으로 동작하게됨
SELF JOIN
table이 자기 자신에게 join하는 경우
Ref.
"쉬운코드"님의 백발백중 시리즈