STUDY/database

[MySQL] 데이터조회(4) JOIN

까미이모 2023. 11. 27. 16:41

JOIN이란?

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

 

implicit join

  • from절에는 table들만 나열하고 where절에 join condition을 명시하는 방식
  • old-style join syntax
  • where절에 selection condition join condition이 같이 있기 때문에 가독성이 떨어진다
  • 복잡한 join 쿼리를 작성하다 보면 실수로 잘못된 쿼리를 작성할 가능성이 크다
-- implicit 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 쿼리 작성 중에도 실수할 가능성이 적다
-- explicit join
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을 만드는 조인

  • FROM table1 [INNER] JOIN table2 ON 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;
-- 왼쪽 테이블 기준으로 조건에 일치하지 않는 튜블도 다 나옴 
  • MySQL은 full outer join을 허용하지 않는다

 

equi join

: join condition에서 = 를 사용하는 join

inner join으로 한정해서 = 를 사용한 경우에 equl join으로 보는 경우도 있다

 

USING 사용

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

 

natural join

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

 

cross join

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

 

 

cross join @MySQL

  • MySQL에서는 cross join = inner join = join
  • CROSS JOIN 에 ON(or USING)을 같이 쓰면 inner join으로 동작한다
  • INNER JOIN이 ON(or USING)없이 사용되면 cross join으로 동작한다

 

self join

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

 

참고: 쉬운코드

'STUDY > database' 카테고리의 다른 글

[MySQL] stored function  (0) 2023.11.27
[MySQL] 데이터 조회(5) group by  (0) 2023.11.27
[MySQL]데이터 조회(3) NULL  (0) 2023.11.27
[MySQL] 데이터 조회(2) subquery  (0) 2023.11.27
[MySQL] 데이터 조회(1)  (1) 2023.11.27