데이터베이스

[Database] 8. JOIN

nayeonee__ 2023. 9. 12. 08:44

본 글은 다음 강의를 보고 작성한 글입니다.

https://www.youtube.com/playlist?list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe 

 

데이터베이스

백엔드에 필요한 DB 지식들을 정리했어요~ :) 내용은 컴공과 수준입니다

www.youtube.com

 

 

SQL 에게 JOIN 이란 ?

  • 2개 이상의 table 들에 있는 데이터를 한 번에 조회하는 것
  • 여러 종류의 JOIN 이 존재한다.

 

implicit join

  • from 절에는 table 들만 나열하고 where 절에 join condition 을 명시하는 방식
  • old - style join syntax
  • where 절에 selection condition 과 join condition 이 같이 있기 때문에 가독성이 떨어진다.
  • 복잡한 join 쿼리를 작성하다 보면 실수로 잘못된 쿼리를 작성할 가능성이 크다.
-- ID 가 1인 임직원이 속한 부서 이름 조회
SELECT D.name
FROM employee AS E, department AS D
WHERE E.id = 1 and E.dept_id = D.id;

 

explicit join

  • from 절에 JOIN 키워드와 함께 joined table 들을 명시하는 방식
  • from 절에서 ON 뒤에 join condition 이 명시된다.
  • 가독성이 좋다
  • 복잡한 join 쿼리 작성중에도 실수할 가능성이 적다.
-- ID 가 1인 임직원이 속한 부서 이름 조회
SELECT D.name
FROM employee AS E JOIN department AS D ON E.dept_id = D.id
WHERE E.id = 1;

 

INNER JOIN

  • 두 table 에서 join condition 을 만족하는 tuple 들로 result table 을 만드는 join
  • FROM table1 [INNER] JOIN table2 join_condition
  • join condition 에 사용가능한 연산자(operator) : = , <, >, ≠ 등등 여러 비교 연산자가 가능하다.
  • join condition 에서 null 값을 가지는 tuple 은 result table 에 포함되지 못한다.
SELECT * 
FROM employee E INNER JOIN department D ON E.dept_id = D.id;

 

OUTER JOIN

  • 두 table 에서 join condition 을 만족하지 않는 tuple 들도 result table 에 포함하는 join
  • FROM table1 LEFT [OUTER] JOIN table2 ON join_condition
  • FROM table1 RIGHT [OUTER] JOIN table2 ON join_condition
  • FROM table1 FULL [OUTER] JOIN table2 ON join_condition
  • join condition 에 사용 가능한 연산자(operator) : =, <, >, ≠ 등등 여러 비교 연산자가 가능하다.
SELECT * 
FROM employee E LEFT OUTER JOIN department D ON E.dept_id = D.id;
SELECT * 
FROM employee E RIGHT OUTER JOIN department D ON E.dept_id = D.id;
SELECT * 
FROM employee E FULL OUTER JOIN department D ON E.dept_id = D.id;

 

EQUI JOIN

join condition 에서 = 를 사용하는 join

  • 두 가지 시각
    • inner join outer join 상관없이 = 를 사용한 join 이라면 equi join 으로 보는 경우
    • inner join 으로 한정해서 = 를 사용한 경우에 equi join 으로 보는 경우

 

USING

SELECT * 
FROM employee E INNER JOIN department D ON E.dept_id = D.dept_id;

															⬇︎
SELECT * 
FROM employee E INNER JOIN department D USING (dept_id);
  • 두 table 이 equi join 을 할 때 join 하는 attribute 의 이름이 같다면, USING 으로 간단하게 작성할 수 있다.
  • 이때 같은 이름의 attribute 는 result table 에서 한번만 표시된다.
  • FROM table [INNER] JOIN table2 USING (attribute(s))
  • FROM table LEFT [OUTER] JOIN table2 USING (attribute(s))
  • FROM table RIGHT [OUTER] JOIN table2 USING (attribute(s))
  • FROM table FULL [OUTER] JOIN table2 USING (attribute(s))

 

NATURAL JOIN

  • 두 table 에서 같은 이름을 가지는 모든 attribute pair 에 대해서 equi join 을 수행
  • join condition 을 따로 명시하지 않는다.
  • FROM table NATURAL [INNER] JOIN table2
  • FROM table NATURAL LEFT [OUTER] JOIN table2
  • FROM table NATURAL RIGHT [OUTER] JOIN table2
  • FROM table NATURAL FULL [OUTER] JOIN table2

 

CROSS JOIN

  • 두 table 의 tuple pair 로 만들 수 있는 모든 조합(=Cartesian product) 을 result table 로 반환한다.
  • join condition 이 없다.
  • implicit cross join : FROM table1, table2
  • explicit cross join : FROM table1 CROSS JOIN table2

 

SELF JOIN

  • table 이 자기 자신에게 join 하는 경우

'데이터베이스' 카테고리의 다른 글

[데이터베이스] JOIN 과 UNION 비교  (0) 2023.09.25
[Database] 9. ORDER BY, GROUP BY, HAVING  (0) 2023.09.11