해당 강의를 보고 정리한 내용입니다.
join의 의미와 여러 종류의 join들을 예제와 함께 살펴보겠습니다.
해당 글은 mysql을 바탕으로 작성하였습니다.
SELECT D.name
FROM employee AS E, department AS D
WHERE E.id=1 AND E.department_id = D.id;
SELECT D.name
FROM employee AS E
JOIN department AS D ON E.dept_id = D.id
WHERE E.id = 1;
SELECT *
FROM employee AS E
INNER JOIN department AS D ON E.dept_id = D.id;
MySQL에서는 JOIN 키워드만 쓸 경우, 자동적으로 INNER JOIN이 된다.
Inner Join은 두 개의 테이블에서 조인 조건을 만족하는 튜플들로 구성된 결과 테이블을 생성하는 조인 연산입니다.
join condition에서 사용 가능한 연산자(operator): =, <, >, != 등 여러 연산자 사용 가능
Inner Join에서는 조인 조건을 만족하지 않는 행을 결과에서 제외합니다. 따라서 조인 조건에서 NULL 값을 가지는 튜플은 결과에 포함되지 않습니다.
두 테이블에서 join condition을 만족하지 않는 tuple들도 result table에 포함하는 join
join condition에서 사용 가능한 연산자(operator): =, <, >, != 등 여러 연산자 사용 가능
Left Outer Join은 첫 번째 (왼쪽) 테이블의 모든 행을 선택하고, 두 번째 (오른쪽) 테이블에서 조인 조건을 만족하는 경우에만 해당 행을 포함시킵니다. 오른쪽 테이블의 조인 조건을 만족하지 않는 경우에는 NULL 값을 가진 열로 결과에 나타납니다.
Right Outer Join 두 번째 (오른쪽) 테이블의 모든 행을 선택하고, 첫 번째 (왼쪽) 테이블에서 조인 조건을 만족하는 경우에만 해당 행을 포함시킵니다. 왼쪽 테이블의 조인 조건을 만족하지 않는 경우에는 NULL 값을 가진 열로 결과에 나타납니다.
Full Outer Join은 두 테이블 중 하나에서 조인 조건을 만족하는 모든 행을 선택합니다. 즉, 왼쪽과 오른쪽 테이블 모두에서 조인 조건을 만족하는 경우와, 한쪽 테이블에서만 조인 조건을 만족하는 경우를 모두 포함합니다.
MySQL에서는 Full Outer Join을 지원하지 않지만, 다른 데이터베이스 시스템에서는 지원하는 경우도 있습니다.
Equi Join은 join 조건에서 등호(=) 연산자(equality comparator)를 사용하여 두 테이블을 연결하는 방식을 의미합니다.
Using은 두 개의 테이블에서 Equi Join을 수행할 때, 조인 조건으로 사용될 열(속성)의 이름이 동일한 경우 간단하게 조인을 수행하기 위한 SQL 키워드입니다.
Using을 사용하면 같은 이름을 가진 열에 대한 조인 조건을 명시할 필요 없이 SQL 쿼리를 작성할 수 있습니다. 또한 결과 테이블에서는 해당 열이 한 번만 나타납니다.
SELECT *
FROM employees
INNER JOIN departments USING (department_id);
Natural Join은 두 개의 테이블에서 동일한 이름을 가진 모든 열(속성) 쌍에 대해 Equi Join을 수행하는 조인 연산입니다.
Natural Join은 조인 조건을 명시적으로 지정하지 않고, 두 테이블에서 열 이름이 동일한 열을 찾아 자동으로 조인합니다.
해당 sql문을 USING 키워드를 사용하면 동일한 결과를 나타내는 쿼리를 작성하면 다음과 같이 나타낼 수 있습니다.
SELECT *
FROM employee E INNER JOIN department D USINT(name, dept_id)
마찬가지로 ON 키워드를 사용하면 동일한 결과를 나타내는 쿼리를 작성하면 다음과 같이 나타낼 수 있습니다.
SELECT *
FROM employee E INNER JOIN department D
ON E.dept_id = D.dept_id AND E.name = D.name(name, dept_id)
따라서 해당 쿼리에 대한 결과값으로 아무것도 반환되지 않을 것입니다.