ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • MySQL JOIN
    카테고리 없음 2017. 2. 6. 20:13



    LEFT OUTER JOIN


    ON 조건은 WHERE 절에서 사용되는 형식과 같은 조건이다. 

    LEFT JOIN에서 ON이나 USING 부분으로 오른쪽 테이블과 일치하는 레코드가 없으면, 

    오른쪽 테이블의 모든 칼럼이 담긴 row 에 NULL을 넣는다. 

    그러므로 다른 테이블에서 카운터파트가 없는 레코드를 찾는데 쓰인다.


    둘 이상의 테이블의 레코드 조합으로 하나의 테이블 레코드인 것처럼 찾는 것을 join이라한다. 




    FULL JOIN

    FULL JOIN은 각 테이블의 레코드 수를 곱한 만큼의 레코드를 출력하며 이를 Cartesian product라 한다. from test1, test2에서 사용한 컴마(,)를 join 연산자로 생각하면 된다. 컴마 대신 join이나 cross join을 사용해도 같은 결과를 보인다.


    mysql > select * from test1, test2;


    mysql> select * from test1,test2;

    +--------+------+------+--------+ 
    | a      | b    | b    | d      | 
    +--------+------+------+--------+ 
    | 금강   |    1 |    1 | 백두산 | 
    | 한강   |    2 |    1 | 백두산 | 
    | 대동강 |    3 |    1 | 백두산 | 
    | 두만강 |    4 |    1 | 백두산 | 
    | 금강   |    1 |    2 | 금강산 | 
    | 한강   |    2 |    2 | 금강산 | 
    | 대동강 |    3 |    2 | 금강산 | 
    | 두만강 |    4 |    2 | 금강산 | 
    | 금강   |    1 |    5 | 지리산 | 
    | 한강   |    2 |    5 | 지리산 | 
    | 대동강 |    3 |    5 | 지리산 | 
    | 두만강 |    4 |    5 | 지리산 | 
    | 금강   |    1 |    6 | 한라산 | 
    | 한강   |    2 |    6 | 한라산 | 
    | 대동강 |    3 |    6 | 한라산 | 
    | 두만강 |    4 |    6 | 한라산 | 
    +--------+------+------+--------+

    16 rows in set (0.00 sec)


    STRAIGHT_JOIN


    straight_join은 컬럼의 순서를 from 절에 나오는 테이블의 순서대로 출력하는 join이다. 


    mysql> select * from test2 straight_join test1;

    +------+--------+--------+------+ 
    | b    | d      | a      | b    | 
    +------+--------+--------+------+ 
    |    1 | 백두산 | 금강   |    1 | 
    |    2 | 금강산 | 금강   |    1 | 
    |    5 | 지리산 | 금강   |    1 | 
    |    6 | 한라산 | 금강   |    1 | 
    |    1 | 백두산 | 한강   |    2 | 
    |    2 | 금강산 | 한강   |    2 | 
    |    5 | 지리산 | 한강   |    2 | 
    |    6 | 한라산 | 한강   |    2 | 
    |    1 | 백두산 | 대동강 |    3 | 
    |    2 | 금강산 | 대동강 |    3 | 
    |    5 | 지리산 | 대동강 |    3 | 
    |    6 | 한라산 | 대동강 |    3 | 
    |    1 | 백두산 | 두만강 |    4 | 
    |    2 | 금강산 | 두만강 |    4 | 
    |    5 | 지리산 | 두만강 |    4 | 
    |    6 | 한라산 | 두만강 |    4 | 
    +------+--------+--------+------+

    16 rows in set (0.01 sec)




    Theta JOIN


    full join에 where 절로 조건을 제시할 경우 이를 Theta join이라 한다. 

    예를 들어, test1과 test2에 b의 값이 동일한 레코드를 선택하는 경우는 다음과 같다. 



    mysql> select * from test1, test2 where test1.b = test2.b;

    +------+------+------+--------+ 
    | a    | b    | b    | d      | 
    +------+------+------+--------+ 
    | 금강 |    1 |    1 | 백두산 | 
    | 한강 |    2 |    2 | 금강산 | 
    +------+------+------+--------+

    2 rows in set (0.00 sec)



    INNER JOIN


    INNER JOIN를 이용하여 앞 예제와 동일한 결과를 얻을 수 있는 예는 다음과 같다.

    이는 select 문에서 join에 사용할 컬럼명ㅇ르 ON test1.b=test2.b 와 같이 직접 지정해도 된다.


    mysql> select * from test1 inner join test2 using(b);

    mysql> select * from test1 inner join test2 on test1.b = test2.b;

    mysql> select * from test1, test2 where test1.b = test2.b;


    +------+------+------+--------+ 
    | a    | b    | b    | d      | 
    +------+------+------+--------+ 
    | 금강 |    1 |    1 | 백두산 | 
    | 한강 |    2 |    2 | 금강산 | 
    +------+------+------+--------+

    2 rows in set (0.00 sec)



    NATURAL JOIN


    두 테이블에 같은 이름을 가진 컬럼이 있고, 이 컬럼을 기준으로 join을 하려면 natural join을 사용한다. 


    mysql > select * from test1 natural join test2;


    +------+------+------+--------+ 
    | a    | b    | b    | d      | 
    +------+------+------+--------+ 
    | 금강 |    1 |    1 | 백두산 | 
    | 한강 |    2 |    2 | 금강산 | 
    +------+------+------+--------+

    2 rows in set (0.00 sec)



    LEFT OUTER JOIN


    test1에는 4개의 레코드가 있는데 where test1.b=test2.b라는 조건 때문에 두 개의 레코드 밖에 선택되지 않았다. 이때 test2의 b에 test1의 b값이 존재하지 않더라도 test1의 레코드를 모두 가져오려면 left outer join을 사용한다 left outer join에서는 outer는 옵션이므로 생략해도 된다. 


    mysql> select * from test1 left join test2 using(b);

    mysql> select * from test1 left join test2 on test1.b = test2.b;


    +--------+------+------+--------+ 

    | a      | b    | b    | d      | 
    +--------+------+------+--------+ 
    | 금강   |    1 |    1 | 백두산 | 
    | 한강   |    2 |    2 | 금강산 | 
    | 대동강 |    3 | NULL | NULL   | 
    | 두만강 |    4 | NULL | NULL   | 
    +--------+------+------+--------+ 

    4 rows in set (0.01 sec)




    RIGHT OUTER JOIN


    test2에는 4개의 레코드가 있는데, where test1.b=test2.b 라는 조건 때문에 2개의 레코드 밖에 선택되지 않는다. 이때 test1의 b에 test2의 b값이 존재하지 않더라도 test2의 레코드를 모두 가져오려면 right outer join을 사용한다. right outer join 에서 outer는 옵션이므로 생략할 수 있다. 


    mysql > select * from test1 right join test2 on test1.b = test2.b;

    +------+------+------+--------+ 
    | a    | b    | b    | d      | 
    +------+------+------+--------+ 
    | 금강 |    1 |    1 | 백두산 | 
    | 한강 |    2 |    2 | 금강산 | 
    | NULL | NULL |    5 | 지리산 | 
    | NULL | NULL |    6 | 한라산 | 
    +------+------+------+--------+

    4 rows in set (0.00 sec)



    INNER JOIN & OUTER JOIN 차이


    INNER JOIN : simple join 이라고도 하며, 둘 이상의 테이블에서 join condition을 만족하는 행만 반환한다. 

    즉, 둘 이상의 테이블에 전부 존재하는 데이터만 조회한다는 것이다 (물론 ON 조건에 만족하는 데이터)

    집합으로 표현하자면 교집합이라 이해하면 된다. 


    OUTER JOIN : OUTER JOIN 에는 LEFT, RIGHT, FULL OUTER JOIN 등의 세가지 형식이 있다.

    INNER JOIN 과는 달리 두 테이블에서 지정된 쪽의(LEFT or RIGHT) 모든 결과를 보여준 후 반대쪽에 매칭되는 값을 보여주고, 값이 없어도 NULL로 보여주는 JOIN이다.


    JOIN 이전에 나오는 테이블이 왼쪽 (LEFT) 테이블이 되고, JOIN 이후에 나오는 테이블은 오른쪽(RIGHT) 테이블이 된다. 




    OUTER JOIN의 종류 및 사용


    LEFT OUTER JOIN - A라는 테이블과 B라는 테이블이 있다면 그 두 테이블 중 왼쪽 테이블을 기준으로 세우는 JOIN


    RIGHT OUTER JOIN - A라는 테이블과 B라는 테이블이 있따면 그 두 테이블 중 올느쪽 테이블을 기준으로 세우는 JOIN 


    FULL OUTER JOIN - 간단하게  LEFT 와 RIGHT JOIN의 합이라고 생각하면 된다. 


    INNER JOIN - FULL OUTER JOIN에서 NULL이 들어간 데이터들이 사라진 합이라고 생각하면 된다.




    [출처]




Designed by Tistory.