정의된 테이블 예시
- 테이블 명: article
attribute | type |
---|---|
id (PRIMARY KEY) | bigint |
title | varchar |
content | varchar |
created_at | datetime |
- 테이블 명: comment
attribute | type |
---|---|
id (PRIMARY KEY) | bigint |
article_id (FOREIGN KEY) | bigint |
content | varchar |
created_at | datetime |
Implicit Join
SELECT A.title
FROM comment AS C, article AS A
WHERE C.id = 1 and C.article_id = A.id;
- FROM 절에는 table 들만 나열하고 where 절에 join condition을 명시하는 방식
- 옛날 방식의 문법이며 WHERE 절에 selection condition과 join condition이 같이 있기 때문에 가독성이 떨어짐
- 복잡한 join 쿼리를 작성하다 보면 실수로 잘못된 쿼리를 작성할 가능성이 큼
Explicit Join
SELECT A.title
FROM comment AS C JOIN article AS A ON C.article_id = A.id
WHERE C.id = 1;
- FROM 절에 JOIN 키워드와 함께 명시하는 방식
JOIN ~ ON ~
에서 ON 뒤에 join condition을 명시- 가독성이 좋고 복잡한 쿼리를 작성하더라도 실수할 가능성이 적음
Inner Join
SELECT A.title
FROM comment AS C [INNER] JOIN article AS A ON C.article_id = A.id;
- 일반적으로 위처럼
JOIN
이라고 하면INNER JOIN
이다. 또한 명시적으로INNER JOIN
이라고 해도 된다. - 두 테이블에서 join condition을 만족하는 tuple들만 결과를 출력한다.
- join condition에서 null 값을 가지는 tuple은 결과에 포함되지 않는다.
Outer Join
- 투 테이블에서 join condition을 만족하지 않는 tuple들도 결과로 출력한다.
LEFT OUTER JOIN
,RIGHT OUTER JOIN
,FULL OUTER JOIN
이 있다.
SELECT A.title
FROM comment AS C LEFT OUTER JOIN article AS A ON C.article_id = A.id;
LEFT OUTER JOIN
은 join condition에 만족하지 않더라도 왼쪽 테이블(comment)에 있는 모든 데이터를 출력한다. 이때 오른쪽 테이블(article)의 값은 null로 채워진다.
SELECT A.title
FROM comment AS C RIGHT OUTER JOIN article AS A ON C.article_id = A.id;
RIGHT OUTER JOIN
은 join condition에 만족하지 않더라도 오른쪽 테이블(article)에 있는 모든 데이터를 출력한다. 이때 왼쪽 테이블(comment)의 값은 null로 채워진다.
SELECT A.title
FROM comment AS C FULL OUTER JOIN article AS A ON C.article_id = A.id;
FULL OUTER JOIN
은 join condition에 만족하지 않더라도 양쪽 테이블에 있는 모든 데이터를 출력한다.
NOTE
MySQL에서는 FULL OUTER JOIN은 지원하지 않는다.
USING
SELECT A.title
FROM comment AS C INNER JOIN article AS A USING (article_id);
article
테이블의id
를article_id
로 변경해주면comment
에서의 attribute와 동일해진다. 즉,C.article_id = A.article_id
라고 join condition을 작성할 수 있다.- 이렇게 두 테이블에서 join하는 attribute의 이름이 같다면 위처럼
USING
을 사용하여 작성할 수 있다. USING
을 사용하면JOIN~ON~
결과와 다르게 출력 결과에 한 번만 표시된다.
Natural Join
SELECT A.title
FROM comment AS C NATURAL INNER JOIN article AS A;
- 두 테이블에서 같은 이름을 가지는 모든 attribute pair에 대해서 join을 수행
Cross Join
- 두 테이블의 tuple pair로 만들 수 있는 모든 조합을 결과로 반환한다.
- Implicit Cross Join:
FROM table1, table2
- Explicit Cross Join:
FROM table1 CROSS JOIN table2
SELECT *
FROM comment CROSS JOIN article;
NOTE
MySQL에서는 join = inner join = cross join 이다. 여기서 on 또는 using을 사용하면 inner join으로 동작하고 없이 사용하면 cross join으로 동작한다.
Self Join
- 테이블이 자기 자신에게 join하는 경우