[Database] SQL - JOIN

SHINYEJI·2023년 10월 16일
0

Database

목록 보기
5/12
post-thumbnail

📌 JOIN

  • 둘 이상의 테이블에서 데이터가 필요한 경우 테이블 조인을 통해 데이터를 조회할 수 있다.

JOIN 종류 (ANSI JOIN)

🔴 INNER JOIN

🔴 OUTTER JOIN

  • LEFT OUTER JOIN
  • RIGHT JOIN
  • FULL JOIN (MySQL 지원 X)

🔴 SELF JOIN

🔴 Non-equi-JOIN

🤔 JOIN 시 주의 할 점
조인 처리 시 어느 테이블을 먼저 읽을지 결정하는 것은 처리할 작업량이 달리지기 때문에 중요하다.

  • INNER JOIN은 어느 테이블을 먼저 읽어도 결과가 달라지지 않아서 MySQL Optimizer가 조인 순서를 조절해서 다양한 방법으로 최적화를 수행한다.
  • OUTER JOIN은 OUTER가 되는 테이블을 먼저 읽어야 함으로 Optimizer가 조인 순서를 선택할 수 없다.

일반 조인 (MySQL 한정)

  • where문에 join조건을 넣어서 join할 수 있다.
  • and키워드로 이어서 where 조건을 줄 수 있다.
select * 
from table_l l, table_r r
where l.common = r.common;-- 조인 조건

INNER JOIN

  • 가장 일반적인 JOIN 종류이다.
  • Equi-Join (동등 조인)이라고도 한다.
  • 컬럼의 교집합을 조인조건으로 사용한다.
  • inner키워드는 생략 가능하다.
  • N-1개의 조인 조건이 필요하다.(N : 조인하는 테이블 개수)

INNER JOIN 사용하기

  • join 조건은 on키워드를 사용하고, 일반 조건은 where을 사용해야 한다.
select common, col_l, col_r
from table_l inner join table_r
on table_l.common = table_r.common;

USING을 이용한 join

  • 조인 조건에 들어갈 컬럼명이 같을 경우 USING키워드를 사용하며 코드를 줄일 수 있다.
select * 
from table_l inner join table_r
-- on table_l.common = table_r.common;
using(common); -- table이름이나 alias를 명시하면 안된다.

NATURAL JOIN

  • natural join은 공통 칼럼을 자동으로 인식하기 때문에 코드가 간결해지는 장점이 있다.
select col1,col2...conN
from table1 NATURAL JOIN table2

🤔 natural join을 사용할 때 주의할 점
조인을 하려는 테이블에 동일한 컬럼이 두 개 이상이라면 의도치 않은 칼럼을 공통 칼럼으로 인식할 수 있기 때문에 주의가 필요하다.


OUTTER JOIN

  • 어느 한 쪽 테이블에는 해당하는 레코드의 데이터가 존재하지 않을(NULL) 경우 해당 데이터가 검색되지 않는 문제점을 해결하기 위해 OUTTER JOIN이 등장했다.
  • outer라는 키워드는 생략 가능하다.

LEFT OUTER JOIN

  • 왼쪽 테이블 기준으로 조인하라는 의미로 왼쪽에 NULL인 값도 모두 포함된다.
select * 
from table_l left join table_r
using(common);

RIGHT OUTER JOIN

  • 오른쪽 테이블 기준으로 조인하라는 의미로 오른쪽에 NULL인 값도 모두 포함된다.
select * 
from table_l right join table_r
using(common);

FULL OUTER JOIN

  • 조인하려는 테이블의 컬럼에 양쪽 모두 없는 데이터도 조회 가능하다.
  • MySQL은 지원하지 않는 키워드다.
    • MySQL에서 full outer join를 사용하기 위해서는 left outer joinright outer joinunion을 하면된다.
select l.common, l.col_l, r.col_r
from table_l l left join table_r r
using(common)

union

select l.common, l.col_l, r.col_r
from table_l l right join table_r r
using(common);

full outer join결과

👀 join 연산 시 *을 사용하지 말고 컬럼명을 명시하자
left join 결과 조회 결과의 컬럼 순서는 common - col_l - col_r이지만
right join 결과 조회 결과의 컬럼 순서는 common - col_r - col_l이다.
이렇게 순서가 다른 컬럼을 union하게 되면 의도치 않게 아래와 같은 결과를 얻을 수 있다.
그러므로 join 컬럼을 명시하자


SELF JOIN

  • 같은 테이블끼리 조인할 때 사용한다.

Non-Equi JOIN

  • table의 Primary key, Foreign key가 아닌 일반 column을 join조건으로 지정하는 것이다.
    즉, 각 공통 컬럼을 조인 조건하지 않는 것이다.

    ex) Not-Equi JOIN

select

0개의 댓글