누가? 누구랑? 무엇으로 조인하는가?


“누가? 누구랑? 무엇으로 조인하는가?.”의 기본원칙은 다음과 같다.

일반적”으로 조인은 관계가 있는 테이블 간에, 관계 컬럼(PK/FK)을 통해 이루어진다. “일반적”을 강조한 이유는 반대로 꼭 그렇지 않은 경우도 있기 때문이다. DBMS는 조인 조건만 만족하면 무조건 데이터를 결합(조인)한다. 실제 테이블 간에 관계(PK/FK)가 있건 없건 상관없다. 하지만 조인을 배우기 시작한 단계에서는 ‘관계’가 있는 테이블 간에 ‘관계’ 컬럼으로 조인이 이루어진다고 생각하는 것이 이해에 도움이 된다.

Untitled

위의 ERD를 살펴보면 Shop(매장)과 Ord(주문)간에 관계선이 그려져 있다. 그러므로 두 테이블은 서로 조인을 할 수 있다. Shop 테이블의 PK인 ShopId가 Ord 테이블에서는 FK로 사용되고 있다. PK/FK 컬럼인 ShopId 컬럼을 사용해 조인을 처리하면 된다. 아래와 같이 조인 SQL을 작성할 수 있다.

-- [SQL-7-3-1]
-- Ord 테이블의 ShopId는 Shop 테이블을 참조한다.
-- Shop 테이블의 ShopId는 Ord 테이블에 참조된다.
SELECT  T1.ShopId ,T1.ShopNm, T1.ShopSize
        ,T2.OrdNo ,T2.OrdAmt
FROM    startdb.Shop T1
        INNER JOIN startdb.Ord T2
            ON (T2.ShopId = T1.ShopId)
WHERE   T1.ShopId = 'S200'
AND     T2.OrdDtm >= STR_TO_DATE('20230101','%Y%m%d')
AND     T2.OrdDtm <  STR_TO_DATE('20230102','%Y%m%d')
ORDER BY T1.ShopId;

이번에는 Memberd와 Ord를 살펴보자. 두 테이블 간에 관계선이 그려져 있고, MemberId가 Member의 PK이면서 Ord에서는 FK다. 두 테이블을 연결하는 조건 컬럼으로 MemberId를 사용할 수 있다는 뜻이다.

-- [SQL-7-3-2]
-- Ord 테이블의 MemberId는 Member 테이블을 참조한다.
-- Member 테이블의 MemberId는 Ord 테이블에 참조된다.
SELECT  T1.MemberId ,T1.NickNm
        ,T2.OrdNo ,T2.MemberId ,T2.OrdAmt
FROM    startdb.Member T1
        INNER JOIN startdb.Ord T2
            ON (T2.MemberId = T1.MemberId)
WHERE   T1.MemberId = 'M0001'
AND     T2.OrdDtm >= STR_TO_DATE('20230101','%Y%m%d')
AND     T2.OrdDtm <  STR_TO_DATE('20230102','%Y%m%d');

다양하게 조인해보기


ERD를 살펴보고, 다양한 테이블 간에 조인을 해보자. 조인에 익숙해지기 위해 필요한 과정이다.