(MySQL) 테이블 조인

<조인의 종류>

1. INNER JOIN
-->INNER JOIN은 어느 테이블을 먼저 읽어도 결과가 달라지지 않으므로 MySQL 옵티마이저가 조인의 순서를 조절해서 다양한 방법으로 최적화를 수행 할 수있다.

네스티드-루프 방식만 지원한다. 네스티드-루프란 일반적으로 프로그램을 작성할 때 두 개의 FOR나 WHILE과 같은 루프 문장을 실행하는 형태로 조인이 처리되는 것이다.

FOR(recor1 IN TABLE1)  //외부루프(OUTER)
{
  FOR(record2 IN TABLE2)  //내부 루프(INNER)
   {
     IF(record1.join_column==record2.join_column)
      {
          join_record_found(record1.*,record2.*);
      } else{
          join_record_notfount();
      }
 }
}
2. OUTER JOIN
--->하지만 OUTER JOIN은 반드시 OUT가 되는 테이블을 먼저 읽어야 하기 떄문에 조인순순서를 옵티마이저 선택 할 수 없다.

FOR(recor1 IN TABLE1)  //외부루프(OUTER)
{
  FOR(record2 IN TABLE2)  //내부 루프(INNER)
   {
     IF(record1.join_column==record2.join_column)
      {
          join_record_found(record1.*,record2.*);
      } else{
          join_record_notfount(record1.*,NULL);
      }
 }
}

위 코드는 TABLE2에 일치하는 레코드가 있으면 INNER조인과 같은 결과를 만들어 내지만,
TABLE2(INNER 테이블) 에 조건을 만족하는 레코드가 없으면 TABLE2의 칼럼을 모두 NULL로 채워서 가져온다. 즉, INNERJOIN에서는 일치하는 레코드를 찾지못했을 때 TABLE1의 결과를 모두 버리지만 OUTER JOIN에서는 TABLE1의 결과를 버리지 않고 그대로 결과에 포함한다.

OUTERJOIN은 LEFT OUTER JOIN과 RIGHT OUTER JOIN 그리고 FULL OUTER JOIN으로 다시 나뉜다.

SELECT *
FROM employees e
  LEFT OUTER JOIN salaries s ON s.emp_no=e.emp_no;

SELECT *
FROM salaries  s
 RIGHT OUTER JOIN employees  e ON e.emp_no=s.emp_no;




댓글

이 블로그의 인기 게시물

(ElasticSearch) 결과에서 순서 정렬

(네트워크)폴링방식 vs 롱 폴링방식

(18장) WebSocekt과 STOMP를 사용하여 메시징하기