-
MySQL JOIN카테고리 없음 2017. 2. 6. 20:13LEFT 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라는 테이블이 있다면 그 두 테이블 중 왼쪽 테이블을 기준으로 세우는 JOINRIGHT OUTER JOIN - A라는 테이블과 B라는 테이블이 있따면 그 두 테이블 중 올느쪽 테이블을 기준으로 세우는 JOINFULL OUTER JOIN - 간단하게 LEFT 와 RIGHT JOIN의 합이라고 생각하면 된다.INNER JOIN - FULL OUTER JOIN에서 NULL이 들어간 데이터들이 사라진 합이라고 생각하면 된다.[출처]