MySQL

Join을 활용한 데이터의 분류 활용

WoodenStella 2023. 1. 10. 14:10

이번 게시글에선 데이터를 join하여 두 개 이상의 데이터를 링크해 다루는 법을 알아보겠다.

이에 앞서, 한 가지 표현방법을 명시하고자 한다.

테이블을 여러 가지 핸들링하는 경우에, 테이블의 행이 어느 테이블에 속하는지 명시하는 방법이다.

예를 들어,

select name, bookname, price
  from Customer, Book;

이와 같이 표시하는 경우, 아래와 같이 name, bookname, price의 소속을 밝혀주는 게 관례이다.

select Customer.name, Book.bookname, Book.price
  from Customer, Book;

이때 테이블의 이름을 일일히 쓰기에 너무 길다면, 짧은 문자로 저장해 쓸 수도 있다.

select cs.name, bo.bookname, bo.price
  from Customer cs, Book bo;

 

이때 짧은 문자의 선언은 from절에서 테이블명 뒤에 붙여쓴다.

사이에 as가 생략된 형태로 생각해도 무방하다.

from Customer cs, Book bo

=

from Customer as cs, Book as bo

그럼 본격적으로 join에 대해 알아보자.

다음과 같은 예시를 그대로 실행시켜본다.

select cs.custid, cs.name, od.bookid, od.saleprice
  from Orders od, Customer cs

.

캡쳐하기엔 너무 길 정도로, 상당히 많은 데이터가 나온다.

총 50개의 데이터, 왜 이렇게 많은 데이터가 나올까?

이는 각자의 테이블의 데이터가 매칭되지 않기 때문이다.

Customer 테이블의 5개 데이터,

Orders 테이블의 10개 데이터가 동시에 노출되면 가질 수 있는 모든 데이터의 경우의 수를 표현하기 때문에,

5 * 10 = 50,

50가지의 항목이 생기는 것이다.

하지만 우리가 추구하는 방식은 우리가 foreign key로 지정했듯이

Customer 테이블에 있는 custid와 Orders 테이블의 custid가 일치하게 10개의 테이블만 노출시키고 싶다.

이때, 마지막 where 줄을 추가하여 다음과 같이 선언해줄 수 있다.

select cs.custid, cs.name, od.bookid, od.saleprice
  from Orders od, Customer cs
  where cs. custid = od. custid;

이와 같이 선언해주면, 결과는 다음과 같이 나온다.

다음과 같이 우리가 원하던 대로, custid 몇 번의 고객이 bookid 몇 번의 도서를 구매했고, 그 가격이 얼마인지를 알 수 있게 되었다.

이것이 Inner Join으로, 양 쪽에 전부 데이터가 있는 경우 join을 걸어 다음과 같이 표시할 수 있다.

이 때, 우리는 Customer의 행에는 포함돼있지만 구매한 기록은 없는 Park Seri 고객을 가지고 있다.

이 경우 Park Seri 고객까지 노출하려면 어떻게 해야 할까?

이때 Outer Join을 사용할 수 있다.

inner join문장을 기준으로 작성하는 방법을 알아보겠다.

Inner Join 문:

select cs.custid, cs.name, od.bookid, od.saleprice
  from Orders od, Customer cs
  where od.custid = cs.custid;

  1. from 문의 두 테이블명 사이에 따옴표를 지우고 outer join을 추가해준다.

from Orders od outer join Customer cs

2. 두 테이블 중 모든 항목을 표시할 테이블이 있는 방향을 outer join 앞에 표시해준다.(left/right)

from Orders od right outer join Customer cs

→ 이 경우 오른 쪽에 있는 Customer의 모든 항목을 대상으로 표시한다.

→ Orders의 모든 항목을 기준으로 표시하고 싶다면 left를 입력하면 된다.

3. where을 on으로 바꿔준다.

on od.custid = cs.custid;

따라서 결과적으로 다음과 같이 작성할 수 있다.

select cs.custid, cs.name, od.bookid, od.saleprice
  from Orders od right outer join Customer cs
  on od.custid = cs.custid;

그러면 다음과 같이 null값을 포함한 데이터를 포함해 값을 표시할 수 있다.

outer join과 마찬가지로, inner join 역시 같은 방법으로 표시할 수는 있다.

select cs.custid, cs.name, od.bookid, od.saleprice
  from Orders od inner join Customer cs
  on od. custid = cs. custid;

물론 결과의 변동은 없기에, 처음에 언급했던 코드로 더 짧게 사용하는 것이 일반적이다.

이상으로 두 개 혹은 그 이상의 데이터를 묶어 처리할 때에 유용한 outer join, inner join 기능을 알아보았다