Database

[DATABASE] JOIN

ju_young 2023. 11. 26. 12:40
728x90

정의된 테이블 예시

  • 테이블 명: 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 테이블의 idarticle_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하는 경우
728x90