본문 바로가기
IT경험공유/DataBase

[DB/SQL] 조인(JOIN) 사용법 INNER/OUTER/CROSS

by 경공N잡러 2023. 3. 11.

조인(JOIN)에 대해 알아보고 다양한 조인에 대해서 차이점을 알아봅시다.

 

목차

     


    조인(JOIN)이란

    두 개 이상의 테이블들을 연결 또는 결합하여 데이터를 출력하는 것을 말합니다. 실무에서는 대부분이 JOIN을 이용하여 SQL을 작성하게 됩니다. JOIN은 관계형 데이터베이스의 가장 큰 장점이자 대표적인 핵심 기능이라고 할 수 있습니다. 일반적으로는 PK(Primary Key)와  FK(Foreign Key) 값의 연관에 의해서 JOIN이 성립됩니다. 단, 연관관계를 가지고 있지 않는 경우도 JOIN을 할 수 있습니다. 

     


    EQUI JOIN 동등 조인 / NON EQUI JOIN 비동등 조인

    EQUI JOIN은 두 개의 테이블 간에 칼럼 값들이 서로 정확하게 일치하는 경우에 사용됩니다. 대부분 PK-FK 관계를 기반으로 합니다. JOIN의 조건은 WHERE 절에 기술하게 되며 ' = ' 연산을 사용합니다. 

    SELECT 테이블1.칼럼명, 테이블2.컬럼명
    FROM 테이블1, 테이블2
    WHERE 테이블1.칼럼명1 = 테이블2.칼럼명2;
    학생
    학번 이름
    1 심길동
    2 이길동

     

    수강
    번호 학번 수강과목
    1 1 컴퓨터
    2 2  데이터베이스
    SELECT 학생.이름 수강.수강과목
    FROM 학생, 과목
    WHERE 학생.학번 = 수강.학번

    학생테이블로는 학생이 어떤 수강과목을 듣고 있는지 확인할 수 없습니다. 수강 테이블로는 수강과목을 듣고 있는 학생의 이름은 알 수 없다. 따라서 두 테이블을 조인을 하여 원하는 결과를 얻을 수 있습니다. 위 SQL 예제는 두 테이블을 조인하여 학생이름과 수강과목을 조회하는 쿼리입니다.

    결과
    이름 수강과목
    심길동 컴퓨터
    이길동 데이터베이스

     

    NON EQUI JOIN은 EQUI JOIN과는 다르게 = 연산이 아닌 다른 연산자를 사용하여 조인하는 방법입니다. 연산자로는 BEWEEN, > , >= . <. <= 등이 있습니다. 대표적인 형태는 다음과 같습니다.

    SELECT 테이블1.칼럼명, 테이블2.칼럼명
    FROM 테이블1, 테이블2
    WHERE 테이블1.칼러명1 <= 테이블2.컬렴명1
    학생 학점등급
    학번 이름 학점 등급 최소 최대
    1 심길동 3.5 1 3.1 4.0
    2 이길동 2.0 2 1.0 3.0
    결과
    이름 등급
    심길동 1
    이길동 2

    위와 같은 결과를 얻기 위해서는 학생과 학점등급 테이블을 NON EQUI JOIN 하여 학점 등급의 최소/최대 값에 포함되는 등급을 찾아 출력해야합니다. SQL은 다음과 같습니다.

    SELECT 학생.이름, 학점등급.등급
    FROM 학생, 학점등급
    WHERE 학생.학점 BETWEEN 학점등급.최소 AND 학점등급.최대

     

     

     


     

    INNER JOIN / OUTER JOIN / NATURAL JOIN

    INNER JOIN / OUTER JOIN / NATURAL JOIN의 이해를 돕기위해 다음과 같이 학생 테이블과 수강테이블이 구성되어 있습니다. 학생 테이블의 학번과 수강 테이블의 학번은 PK-FK 관계이며 타입과 칼럼명이 동일합니다.

    학생
    학번 이름
    1 심길동
    2 이길동
    3 김길동

     

    수강
    번호 학번 수강과목
    1 1 컴퓨터
    2 2  데이터베이스
    3 1 경제학

    INNER JOIN은 내부 조인이라고 하며 JOIN 조건에서 동일한 값이 있는 행만 반환됩니다. FROM 절에 JOIN 조건을 정의하며 INNER JOIN은 JOIN의 디폴트 옵션으로 INNER는 생략이 가능합니다.

    --INNER JOIN 사용
    SELECT 학생.이름, 수강.수강과목
    FROM 학생 INNER JOIN 수강 
    ON 학생.학번 = 수강.학번;
    
    --INNER를 생략하여 사용가능
    SELECT 학생.이름, 수강.수강과목
    FROM 학생 JOIN 수강 
    ON 학생.학번 = 수강.학번;
    
    -- WHERE 절을 사용
    SELECT 학생.이름, 수강.수강과목
    FROM 학생 수강 
    WHERE 학생.학번 = 수강.학번;
    결과
    이름 수강과목
    심길동 컴퓨터
    이길동 데이터베이스
    심길동 경제학

    INNER JOIN의 결과로 수강테이블에 학번이 존재하는 학생들만 출력이 되었고 김길동 학생은 수강테이블에 존재하지 않았기 때문에 출력되지 않았습니다.

     

    OUTER JOIN 내부조인과 달리 JOIN 조건에서 동일한 값이 없는 행 또한 반환 할 수 있습니다.

     

    LEFT OUTER JOIN

    조인 수행시 좌측 테이블이 기준이 되어 조인을 진행합니다.

    --LEFT OUTER JOIN 사용
    SELECT 학생.이름, 수강.수강과목
    FROM 학생 LEFT OUTER JOIN 수강 
    ON 학생.학번 = 수강.학번;
    
    --OUTER  생략
    SELECT 학생.이름, 수강.수강과목
    FROM 학생 LEFT JOIN 수강 
    ON 학생.학번 = 수강.학번;
    결과
    이름 수강과목
    심길동 컴퓨터
    심길동 경제학
    이길동 데이터베이스
    김길동 NULL

    RIGHT OUTER JOIN

    조인 수행시 우측 테이블이 기준이 되어 조인을 진행합니다.

    --RIGHT OUTER JOIN 사용
    SELECT 학생.이름, 수강.수강과목
    FROM 학생 RIGHT OUTER JOIN 수강 
    ON 학생.학번 = 수강.학번;
    
    --OUTER  생략
    SELECT 학생.이름, 수강.수강과목
    FROM 학생 RIGHT JOIN 수강 
    ON 학생.학번 = 수강.학번;
    결과
    이름 수강과목
    심길동 컴퓨터
    이길동 데이터베이스
    심길동 경제학

    FULL OUTER JOIN

    조인 수행시  좌측, 우측 테이블의 모든 데이터를 읽어 JOIN 하여 결과를 생성합니다. 두 테이블의 합집합과 같습니다. 따라서 LEFT OUTER와 RIGHT OUTER 결과에 중복을 제거하여 더한 결과와 같습니다.

    --FULL OUTER JOIN 사용
    SELECT 학생.이름, 수강.수강과목
    FROM 학생 FULL OUTER JOIN 수강 
    ON 학생.학번 = 수강.학번;
    
    --OUTER  생략
    SELECT 학생.이름, 수강.수강과목
    FROM 학생 FULL JOIN 수강 
    ON 학생.학번 = 수강.학번;
    
    --LEFT OUTER RIGHT OUTER JOIN 사용
    SELECT 학생.이름, 수강.수강과목
    FROM 학생 LEFT OUTER JOIN 수강 
    ON 학생.학번 = 수강.학번
    UNION
    SELECT 학생.이름, 수강.수강과목
    FROM 학생 RIGHT OUTER JOIN 수강 
    ON 학생.학번 = 수강.학번;
    결과
    이름 수강과목
    심길동 컴퓨터
    심길동 경제학
    이길동 데이터베이스
    김길동 NULL

     

    NATURAL JOIN은 자연조인이라하여 두 테이블에서 칼럼명이 똑같고 타입이 정확히 똑같은 칼럼들을 모두 조인합니다.

    NATURAL JOIN의 결과를 보면 학번칼럼이 두 테이블의 공통이기 때문에 학번으로 기준이 되어 조인된 것을 확인할 수 있습니다. JOIN 칼럼에 대해서는 ALIAS나 테이블 이름과 같은 접두사를 붙일 수 없습니다. ( 학생. 학번(X) -> 학번(O) ) 

    SELECT * 
    FROM 학생 NATURAL JOIN 수강;

    자연조인은 동일한 칼럼명과 타입을 가진 모든 칼럼을 가지고 조인을 하지만 USING 구문을 통해서 원하는 칼럼에 대해서만 선택적으로 조인을 할 수 있습니다. USING절 칼럼 부분은 식별자를 가질 수 없습니다.

    SELECT *
    FROM 학생 JOIN 수강
    USING (학번);

    위 SQL의 구문처럼 * 를 하여 별도의 칼럼 순서를 지정하지 않으면 조인절의 기준이 되는 칼럼이 제일 먼저 출력되게 됩니다.

    결과
    학번 번호 수강과목
    1 1 컴퓨터
    2 2  데이터베이스
    1 3 경제학

     

     


     

    CROSS JOIN

    CROSS JOIN은 집합 연산자의 PRODUCT의 개념을 테이블 간 JOIN 조건이 없는 경우 생길 수 있는 모든 경우의 데이터 조합을 반환합니다.

    학생
    학번 이름
    1 심길동
    2 이길동
    3 김길동

     

    수강
    번호 학번 수강과목
    1 1 컴퓨터
    2 2  데이터베이스
    3 1 경제학

     

    SELECT 학번, 번호
    FROM 학생 CROSS JOIN 수강
    ORDER BY 학번
    학번 번호
    1 1
    1 2
    1 3
    2 1
    2 2
    2 3
    3 1
    3 2
    3 3

    결과도는 모든 경우의 수가 나오게 되어 학생 테이블 행 3개 수강 테이블 행 3개를 곱한 9개의 결과를 반환하게 됩니다. 

    댓글