포스트

SQLD: JOIN

JOIN

FROM 뒤에 테이블을 두 개 이상 입력할 수 있다.

테이블을 두 개 이상 입력하게 되면 튜플(행)의 개수는 (테이블A의 개수 * 테이블B의 개수)로 곱으로 나오고, 컬럼(열)의 개수는 (테이블A의 개수 + 테이블B의 개수)인 합으로 나온다.

테이블이 두 개 이상이라면 테이블을 명시해서 컬럼을 입력해야 한다.

1
2
3
4
5
6
SELECT TB_CUST.CUST_ID
        , TB_CUST.CUST_NAME
        , TB_CUST_BADGE.CUST_ID
        , TB_CUST_BADGE.BADGE_ID
    FROM TB_CUST
        ,TB_CUST_BADGE;

FROM 뒤 테이블에 별칭을 주명 작성이 더 쉬워진다. 이는 실제로 현업에서 많이 사용하며, 여기에는 SELECT처럼 AS를 따로 사용하지 않고 단순히 뒤에 명시만 해준다.
단, FROM 뒤 테이블에 별칭을 주면 이후에는 별칭만 사용해야 한다. 즉, 혼용해서 사용하면 오류가 발생한다.

1
2
3
4
5
6
SELECT A.CUST_ID
        , A.CUST_NAME
        , B.CUST_ID
        , B.BADGE_ID
    FROM TB_CUST A
        ,TB_CUST_BADGE B;

JOIN은 여러 테이블에서 필요한 데이터를 한번에 가져오는 기술이다.

다음 테이블들을 참고하여 회원 ID가 A0001인 회원의 이름과 휴대폰 번호를 구해보자.

image

이를 이용하여 하나의 테이블로 만들어보면 카티션 조인을 수행하여 모든 경우의 수를 합쳐놓는다.

1
2
3
SELECT *
FROM 회원 A
    ,회원연락처 B;

image

그렇기 때문에, 특정 컬럼을 이용하여 서로 연결된 데이터만 남겨놓아야 한다.

1
2
3
4
SELECT *
FROM 회원 A
    ,회원연락처 B
WHERE A.회원ID = B.회원ID;  -- JOIN 조건

JOIN 조건

서로 다른 테이블에 연관성 있는 데이터만 남기기 위한 조건

여기에 기존에 사용하던 일반 조건들을 사용하면 A0001의 이름과 휴대폰 번호를 구할 수 있다:

1
2
3
4
5
6
SELECT *
FROM 회원 A
    ,회원연락처 B
WHERE A.회원ID = B.회원ID;  -- JOIN 조건
    AND A.회원ID = 'A0001' -- 일반조건
    AND B.구분코드 = '휴대폰'; -- 일반조건  

INNER JOIN은 두 테이블 간에 조건에 일치하는 대상만 출력한다. WHERE을 사용하여 WHERE A.회원ID = B.회원ID;를 하는 것을 INNER JOIN이라고 한다.

OUTER JOIN은 두 테이블 간에 특정 테이블을 기준으로 조건에 일치하지 않는 대상도 출력을 해준다.

1
2
3
4
SELECT *
FROM 회원 A
    ,회원연락처 B
WHERE A.회원ID = B.회원ID(+);  -- JOIN 조건  

(+) 기호가 붙은 대상의 반대쪽을 기준으로 조건에 맞지 않는 대상도 출력한다.

image

  1. (+) 기호는 OUTER JOIN을 의미한다. 기호가 따로 없으면 INNER JOIN이다.
  2. 조인조건에서 (+)기호가 붙어있는 쪽의 반대 테이블을 기준으로 한다.
  3. (+) 기호는 오라클 데이터베이스에서만 사용하는 방식이다.

표준 JOIN

ANSI 조인은 모든 DBMS에서 사용 가능한 조인 문법이다.

오라클 조인과 ANSI의 차이점

1
2
3
4
5
6
7
8
9
--오라클
SELECT A.CUST_ID
        , A.CUST_NAME
        , B.BUY_ID
        , B.PRD_ID
    FROM TB_CUST A
        ,TB_DEAL B
    WHERE A.CUST_ID = B.BUY_ID(+)
    AND A.CUST_ID IN ('C0001', 'C0002');
  • WHERE 부분에 조인조건을 사용한다
  • 아우터 조인은 (+)기호로 표시한다
1
2
3
4
5
6
7
8
--ANSI
SELECT A.CUST_ID
        , A.CUST_NAME
        , B.BUY_ID
        , B.PRD_ID
    FROM TB_CUST A LEFT OUTER JOIN TB_DEAL B 
    ON (A.CUST_ID = B.BUY_ID)
    WHERE A.CUST_ID IN ('C0001', 'C0002');
  • FROM 뒤에 ON 부분에 조인조건을 사용한다
  • (+)기호가 필요 없다

양쪽 테이블 모두 OUTER JOIN을 하고 싶다면 FULL OUTER JOIN을 이용한다. (오라클 문법에는 존재하지 않는다.)

1
2
3
SELECT * 
FROM 회원 A FULL OUTER JOIN 회원연락처 B 
ON (A.회원ID = B.회원ID); 

image

CROSS JOIN

조인하려는 두 테이블 간에 모든 데이터 조합을 의미한다.

기존에 사용한 카티션 조인과 똑같다. 모든 조합을 만들어내며, 이 때문에 ON을 사용할 수 없다.

1
2
SELECT * 
FROM 고객 CROSS JOIN 고객전화번호; 

테이블 간에 특정 컬럼으로 연결을 하는 조인조건은 최소한 ‘FROM 뒤에 입력된 테이블 개수 -1개 만큼’의 조인 조건이 필요하다.

가령 테이블 4개를 조인하고자 한다면 조인조건을 최소 3개 사용해야 한다.

동등 JOIN과 비동등 JOIN

’=’뿐만이 아니라 다른 연산자로도 JOIN이 가능하며, JOIN 조건이 하나라도 ‘=’가 아닌 경우 비동등 JOIN이라고 한다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.