1. JOIN
JOIN 연산은 두 테이블을 결합하는 연산입니다.
각, 테이블은 각자에 맞는 데이터를 저장하고 있는데, 서로 다른 테이블에서 데이터를 가져오려면 JOIN 연산을 해야 합니다.
예를 들어, 아래와 같은 상품(product), 재고(stock) 두 테이블이 있을 때, JOIN의 결과는 아래 테이블과 같습니다.
# SELECT * FROM product, stock;
product와 sotck의 데이터 개수가 각각 3개였기 때문에, JOIN을 하면 두 테이블을 결합한 9개의 데이터가 조회됩니다.
이처럼 JOIN은 서로 다른 두 테이블을 결합할 수 있지만, 연산량이 엄청나게 증가해버립니다.
그래서 DB를 설계할 때 JOIN 연산을 피하기 위해서라도 테이블의 개수를 최대한 줄이는 것이 좋습니다.
하지만 RDB에서 JOIN은 필수적으로 수행되어야 하는 연산입니다.
테이블은 각자에게 알맞는 데이터들을 저장하도록 설계되기 때문이죠.
어쨋든 RDB에 있어서, JOIN은 그만큼 중요하고 잘 사용할 수 있어야 합니다.
2. JOIN의 종류
이제 JOIN 명령어에 대해 알아보도록 하겠습니다.
JOIN 연산의 종류에는 여러가지가 있습니다.
1) Cross JOIN
위에서 살펴본 것이 두 테이블의 곱집합을 수행하는 교차 결합( Cross Join )입니다.
# SELECT * FROM table1, table2, ...
2) Inner JOIN
내부 결합( Inner Join )은 교차 결합에 WHERE 조건을 추가하여 조건에 맞는 데이터들만 조회하는 방식입니다.
아래는 Cross join 쿼리의 결과인 총 9개의 데이터 중에서, product_no가 같은 데이터들만 조회하는 예제입니다.
# SELECT * FROM product, stock WHERE product.product_no = stock.product_no;
위와 같이 특정 컬럼이 같은 데이터를 조회하도록 조건을 추가시킨 결합을 동등 결합( EQUI JOIN )이라고 하는데, JOIN에서 가장 많이 쓰이는 것이 EQUI JOIN입니다.
이렇게 내부결합을 이용하면 두 테이블을 결합시켜서 원하는 데이터를 조회할 수 있습니다.
그런데 위의 쿼리처럼 INNER JOIN을 작성하는 것은 옛날 작성법입니다.
조금 더 트렌디한 작성법은 아래와 같이 작성하는 것입니다.
# SELECT * FROM product INNER JOIN stock ON product.product_no = stock.product_no;
INNER JOIN 좌우에 결합 할 테이블 명을 작성하고, ON 뒤에는 결합 조건을 명시합니다.
이렇게 작성하면, 조건( WHERE )이 추가적으로 붙을 경우 쿼리문이 조금 더 직관적으로 보입니다.
3) External JOIN
외부 결합은 어느 한쪽 테이블에만 존재하는 데이터들을 다른 테이블에 결합하는 방식입니다.
구체적인 예를 위해, 처음에 봤던 상품 테이블에 D라는 상품을 추가했습니다
그러고나서 위의 예제와 똑같이 EQUI JOIN을 수행하면 결과는 다음과 같습니다.
# SELECT * FROM product INNER JOIN stock ON product.product_no = stock.product_no;
EQUI JOIN을 수행하면 빨간색으로 표시한 데이터만 조회되고, product_no가 4인 데이터는 결과에서 제외됩니다.
재고 테이블에 product_no가 4인 데이터가 없기 때문이죠.
이번에는 같은 상황에서 외부 결합을 사용해보겠습니다.
외부 결합에는 왼쪽에서 붙이는 LEFT JOIN과 오른쪽에서 붙이는 RIGHT JOIN이 있습니다.
아래는 LEFT JOIN을 사용하는 예제입니다.
# SELECT * FROM product LEFT JOIN stock ON product.product_no = stock.product_no;
내부 결합과 마찬가지로 두 테이블을 결합하는데, 이 때 product_no가 4인 값이 재고 테이블에 없기 때문에 외부 결합을 하면 모두 NULL로 처리되면서 추가됩니다.
LEFT JOIN의 결과는 상품 테이블에서 product_no가 4인 데이터에 대해 재고 테이블이 존재하지 않으므로 NULL이 결합되어 조회됩니다.
이상으로 JOIN에 대해 알아보았습니다.
'Database > MySQL' 카테고리의 다른 글
[MySQL] MySQL의 password() 함수와 암호화 (2) | 2018.03.11 |
---|---|
[MySQL] SYSDATE()와 NOW()의 차이 (0) | 2018.03.11 |
[MySQL] 인덱스(Index table) , 뷰(View table) (0) | 2018.03.11 |
[MySQL] 서브쿼리 ( subquery ) (1) | 2018.03.11 |
[MySQL] GROUP BY , HAVING (0) | 2018.03.11 |
[MySQL] Alias, 함수, 집합연산 (0) | 2018.03.11 |
[MySQL] DDL, DML 기본 명령어 (2) | 2018.03.11 |