조금씩 꾸준히 완성을 향해

[MySQL] JOIN 테이블 결합하기(INEER, OUTER, CROSS, SELF) 본문

Database/MySQL

[MySQL] JOIN 테이블 결합하기(INEER, OUTER, CROSS, SELF)

all_sound 2022. 9. 21. 10:14

 J O I N


  •  두개 이상의 테이블을 서로 묶어서 하나의 결과 집합으로 만들어 내는 것을 말한다. 
  • 데이터베이스의 테이블은 중복과 공간낭비를 피하고 데이터의 무결성을 위해 여러 개의 테이블로 분리하여 저장된다. 이 분리된 테이블들이 가지는 관계(relation)를 활용해 테이블을 합칠 수 있다.
  • 종류 : INNER JOIN, OUTER JOIN, CROSS JOIN, SELF JOIN

 

 

INNDER JOIN (내부 결합)


  • 조인 중에서 가장 많이 사용되는 조인
  • 공통된 열이 존재할 경우 사용 가능
-- 사용할 테이블 확인
mysql> select * from 상품; select * from 재고수;
+----------+--------+----------+------+----------+
| 상품코드  | 상품명 | 메이커명  | 가격 | 상품분류 |
+----------+--------+----------+------+----------+
| 0001     | 상품1  | 메이커1  |  100 | 식료품   |
| 0002     | 상품2  | 메이커2  |  200 | 식료품   |
| 0003     | 상품3  | 메이커3  | 1980 | 생활용품 |
+----------+--------+----------+------+----------+
+----------+------------+--------+
| 상품코드 | 입고일     | 재고수 |
+----------+------------+--------+
| 0001     | 2014-01-03 |    200 |
| 0002     | 2014-02-10 |    500 |
| 0003     | 2014-02-14 |     10 |
+----------+------------+--------+
-- Primary Key가 없을 경우 설정
ALTER TABLE 재고수 MODIFY 상품코드 CHAR(4) PRIMARY KEY;
-- 모든 열 가져오기
mysql> SELECT * FROM 상품 
    -> JOIN 재고수 
    -> ON 상품.상품코드 = 재고수.상품코드;
+----------+--------+----------+------+----------+----------+------------+--------+
| 상품코드  | 상품명 | 메이커명 | 가격  | 상품분류 | 상품코드  | 입고일     | 재고수 |
+----------+--------+----------+------+----------+----------+------------+--------+
| 0001     | 상품1  | 메이커1  |  100 | 식료품   | 0001     | 2014-01-03 |    200 |
| 0002     | 상품2  | 메이커2  |  200 | 식료품   | 0002     | 2014-02-10 |    500 |
| 0003     | 상품3  | 메이커3  | 1980 | 생활용품 | 0003     | 2014-02-14 |     10 |
+----------+--------+----------+------+----------+----------+------------+--------+
-- 특정 열만 가져오기 & 별칭설정
mysql> SELECT S.상품명, M.메이커명 FROM 상품2 S 
    -> INNER JOIN 메이커 M 
    -> ON S.메이커코드 = M.메이커코드;
+--------+----------+
| 상품명 | 메이커명 |
+--------+----------+
| 상품1  | 메이커1  |
| 상품2  | 메이커1  |
| 상품3  | 메이커2  |
+--------+----------+

 

 

OUTER JOIN (외부 결합)


조인의 조건에 만족되지 않는 행까지도 포함시키는 결합 

 

LEFT OUTER JOIN  (LEFT JOIN) : 왼쪽 테이블의 것은 모두 출력되어야 한다. 

RIGHT OUTER JOIN (LEFT JOIN) : 오른쪽 테이블의 것은 모두 출력되어야 한다.

 

mysql> SELECT 상품3.상품명, 재고수.재고수 
    -> FROM 상품3 RIGHT JOIN 재고수 
    -> ON 상품3.상품코드 = 재고수.상품코드;
+--------+--------+
| 상품명 | 재고수 |
+--------+--------+
| 상품1  |    200 |
| 상품2  |    500 |
| 상품3  |     10 |
+--------+--------+
mysql> SELECT 상품3.상품명, 재고수.재고수 
    -> FROM 상품3 LEFT JOIN 재고수 
    -> ON 상품3.상품코드 = 재고수.상품코드;
+----------+--------+
| 상품명   | 재고수 |
+----------+--------+
| 상품1    |    200 |
| 상품2    |    500 |
| 상품3    |     10 |
| 추가상품 |   NULL |
+----------+--------+

 

 

CROSS JOIN (교차 결합)


한쪽 테이블의 모든 행들과 다른 쪽 테이블의 모든 행을 조인시키는 기능 

cross join 결과의 개수 = 두 테이블 개수를 곱한 개수   

 

테스트로 사용할 많은 용량의 데이터를 생성할 때 주로 사용된다. ( ON 구문은 사용 불가)

대량의 데이터를 생성하면 시스템이 다운되거나 디스크 용량이 모두 찰 수 있다. 

 

mysql> SELECT * FROM sample72_x  -- A, B, C
    -> CROSS JOIN sample72_y;  -- 1, 2, 3
+------+------+
| x    | y    |
+------+------+
| C    |    1 |
| B    |    1 |
| A    |    1 |
| C    |    2 |
| B    |    2 |
| A    |    2 |
| C    |    3 |
| B    |    3 |
| A    |    3 |
+------+------+

 

 

SELF JOIN (자기 결합)


한 테이블이 자기자신과 조인하는 기능

사용법은 일반적인 INNER JOIN과 같다. 

 

mysql> select a.상품명, b.상품분류
    -> from 상품 a
    -> join 상품 b
    -> on a.상품코드 = b.상품코드;
+--------+----------+
| 상품명 | 상품분류 |
+--------+----------+
| 상품1  | 식료품   |
| 상품2  | 식료품   |
| 상품3  | 생활용품 |
+--------+----------+