본문 바로가기
IT 및 기타

오라클 테이블 left, inner, outer 조인에 대해서 알아보자(Oracle)

by 도쿄정대리! 2022. 9. 30.

데이터베이스를 만지다 보면 조인을 할 일이 굉장히 많이 있습니다. Oracle DB에서 left, right, inner, outer 각각의 조인 방법에 대해서 알아보도록 하겠습니다.

 

목차

     

     

     

     

    sql joins라고 적혀 있고 각각의 조인 방법에 따라 취득하는 데이터를 그림으로 나타내고 있다.
    오라클 테이블 조인 이미지

     

    Oracle의 INNER JOIN내부 결합[SQL]

    Oralce에서 여러 개의 테이블을 결합할 때 JOIN을 사용합니다.

    내부 결합은?

    결합에는 아래의 종류가 있습니다.

    · 내부 결합(INNER JOIN)

    · 외부 결합(LEFT JOIN, RIGHT JOIN)

     

    내부 결합은 여러 개의 테이블을 결합하여 조건이 일치한 것만을 얻습니다.

    외부 결합은 우선 테이블에서 있으면 조건이 일치하지 않아도 데이터를 취득합니다만, 내부 결합은 그렇지 않습니다.

     

    (INNER) JOIN ~

    Oralce에서 내부 결합하려면 INNER JOIN구문의 전후에 결합할 테이블을 기술합니다. 테이블 이름 뒤에 스페이스를 넣어 별명을 지정합니다. INNER는 생략 가능하므로, 여기에서는 생략합니다. ON 은 결합하는 칼럼명을 지정합니다. 줄은 테이블 이름의 지정 이름과 같이 사용합니다.

     

    -내부 결합 JOIN을 사용
    SELECT {컬럼} FROM {테이블1} a (INNER)JOIN {테이블2} b ON{a.컬럼1}={b.컬럼2} WHERE 조건;
    
    -내부 결합 JOIN을 사용하지 않음
    SELECT{컬럼} FROM {테이블1} a, {테이블2} b WHERE{a.컬럼1}={b.컬럼2} AND 조건;

    내부 결합은 여러 개의 테이블을 그대로 결합하고 그 결과를 취득합니다.

    상기의 예시 (INNER) JOIN에서는 {테이블 1}과 {테이블 2}를 결합하고 그 결과를 취득하는데요.

     

    "INNER"은 생략 가능하므로, 여기에서는 생략합니다.

    내부 결합은 굳이 "JOIN"을 쓰지 않고 결합 조건을 WHERE 구문에 적을 수도 있습니다.

     

    샘플 데이터

    emp테이블

    empno empname
    A001 사토와 나코
    A002 타나카 타로
    A003 카토오 하지메
    A004 아오키 하나
    A005 후지타 마나부

    tokyo_aut테이블

    empno
    A001
    A005

    osaka_aut테이블

    empno
    A001
    A002

     

    예시 1. INNER JOIN으 결합

    --INNER JOIN
    SELECT e.empno, e.empname, t.empno tokyo, o.empno osaka 
    	FROM 
        	emp e 
        JOIN 
        	tokyo_aut tONe.empno = t.empno
        JOIN 
        	osaka_aut oONt.empno = o.empno
        WHERE 
        	e.empno <'A999';
    e.empno e.empname tokyo osaka
    A001 사토와 나코 A001 A001

    emp 테이블과 tokyo_aut, osaka_aut  2개의 테이블을 (inner) JOIN으로 내부 재결합을 했습니다.

    3개의 테이블 emp, tokyo_aut, osaka_aut 테이블과 일치하는 레코드만이 SELECT 됩니다.

     

    예시 2. WHERE 결합(JOIN 사용하지 않는 패턴)

    --JOIN을 사용하지 않는
    SELECTe.empno, e.empname, t.empno tokyo, o.empno osaka
    	FROM
        	emp e 
     		,tokyo_aut t
     		,osaka_aut o
        WHERE 
        	e.empno <'A999'
            AND
        		e.empno = t.empno
            AND
        		t.empno = o.empno;
    e.empno e.empname tokyo osaka
    A001 사토와 나코 A001 A001

    예시 1과 같이 내부 결합을 INNER JOIN을 사용하지 않고 썼습니다.

    3개의 테이블 emp, tokyo_aut, osaka_aut 테이블들의 결합 조건을 WHERE 문에 사용했습니다.

     

    Oracle의 OUTER JOIN 외부 결합[SQL]

    이번에는 외부 결합(OUTER JOIN)에 대해서 해설합니다.

     

    외부 결합(OUTER JOIN)은 2종류가 있습니다.

     

    ·LEFT OUTER JOIN

    ·RIGHT OUTER JOIN

     

    결합은 여러 개의 테이블을 선택하여 데이터를 추출하는 것입니다. 외부 결합은 우선할 테이블을 바탕으로 결합합니다.

    예컨대 "우선하는 테이블 A"와 "우선하지 않는 테이블 B"를 결합할 경우 A테이블은 전 레코드로 표시됩니다만, B테이블은 A테이블과 일치하는 것밖에 표시되지 않습니다.

     

    외부 결합은 이처럼 우선할 테이블을 바탕으로 결합하는 이미지입니다. 가장 자주 사용되는 조인(결합)이 됩니다.

    LEFT OUTER JOIN은 왼쪽 테이블, RIGHT OUTER JOIN은 오른쪽 테이블을 바탕으로 조인(결합)합니다.

    ・LEFT (OUTER) JOIN ~

    외부 결합하려면 LEFT JOIN·RIGHT JOIN 구문의 전후에 결합할 테이블을 기술합니다. 테이블 이름 뒤에 스페이스를 넣어 지정 이름(별명)을 지정합니다."OUTER"는 생략 가능하므로, 여기에서는 생략합니다.

    그리고"ON"으로 결합하는 조건을 지정합니다. 칼럼은 테이블 명의 지정 이름(별명)과 꼭 같이 사용해야 합니다.

    -외부 결합 LEFT JOIN
    SELECT {컬럼명}
    	FROM {테이블1} a
        LEFT JOIN {테이블2} b 
        	ON {a.컬럼명1}= {b.컬럼명2}
        WHERE 조건;-외부 결합 RIGHT JOIN
    SELECT {컬럼명}
    	FROM {테이블1}a
        RIGHT JOIN {테이블2} b
        	ON {a.컬럼명1}= {b.컬럼명2}
        WHERE 조건;

    외부 결합은 우선할 테이블을 바탕으로 결합합니다. 상기의 예, LEFT JOIN에서는 {테이블 1}과 {테이블 2}를 결합합니다만, {테이블 1}의 전 레코드에 대해서 {테이블 2}는 조건에 일치한 것만을 결합합니다.

    그렇기 때문에 {테이블 1}은 전 레코드가 SELECT 됩니다. {테이블 2}는 {테이블 1}과 결합한 레코드만 SELECT 됩니다.

    RIGHT JOIN은 테이블의 우선도가 거꾸로 되므로 테이블 2의 전 레코드가 SELECT 됩니다.

     

    샘플 데이터

    emp

    empno empname
    A001 사토와 나코
    A002 타나카 타로
    A003 카토오 하지메
    A004 아오키 하나
    A005 후지타 마나부

    tokyo_aut

    empno
    A001
    A005

    osaka_aut

    empno
    A001
    A002

     

    예시 1. LEFT JOIN로 결합

    --LEFT JOIN의 결합
    SELECT 
    	e.empno
    	, e.empname
    	, t.empno tokyo
    	, o.empno osaka
        FROM
        	emp e
        LEFT JOIN
           	tokyo_aut t
            ON e.empno = t.empno
        LEFT JOIN
           	osaka_aut o
           	ON e.empno = o.empno
        WHERE 
           	e.empno <'A999';

     

    e.empno e.empname tokyo osaka
    A001 사토와 나코 A001 A001
    A002 타나카 타로   A002
    A003 카토오 하지메    
    A004 아오키 하나    
    A005 후지타 마나부 A005  

    3개의 테이블 emp, tokyo_aut, osaka_aut을 LEFT JOIN으로 외부 결합했습니다.

    우선하는 테이블은 전 레코드 표시

    LEFT JOIN이라 우선하는 테이블은 제일 먼저 나와있는 emp테이블입니다. emp 테이블은 전 레코드가 SELECT 됩니다.

    emp 테이블에는 레코드 5개가 있는데요. 우선 이 테이블에서 SELECT 한 e.empno, e.empname은 모두 표시됩니다.

    결합하는 테이블은 조건이 일치하는 레코드만 표시

    나머지 두 개의 테이블 tokyo_aut, osaka_aut은 ON으로 지정된 조건에 일치하는 경우에만 SELECT 됩니다.

    tokyo_aut 테이블은 empno가 A001, A005 뿐이어서 이 두 개의 레코드만 표시되고 나머지는 표시되지 않습니다.

    osaka_aut 테이블도 empno가 A001, A002 뿐이어서 이 두 개의 레코드만 표시되고 나머지는 표시되지 않습니다.

    외부 결합에는 LEFT JOIN과 RIGHT JOIN 이 두 종류가 있지만, 보통 LEFT JOIN을 사용하는 것이 일반적이어서 RIGHT JOIN의 예는 여기에서는 생략하도록 하겠습니다.

    참고자료 : https://sql-oracle.com/?p=1523 
    그럼 오늘도 즐거운 개발 하시길 기원하면서 마치겠습니다.
    반응형

    댓글