CS/데이터베이스

[Database] JOIN (조인) 정리 (LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN)

대기업 가고 싶은 공돌이 2024. 8. 21. 02:02

JOIN

  • 여러 테이블의 데이터를 사용하여 동시 출력하거나 참조 할 경우 사용
  • from 절에 조인할 테이블 나열
  • oracle 표준은 테이블 나열 순서가 중요하지 않다.
  • where 절에서 조인 조건을 작성한다.
    • 동일한 열 이름이 여러 테이블에 존재할 경우 열 이름 앞에 테이블 이름이나 alias를 사용한다.
    • 여기서 alias는 당연히 from 절에서 정의해야 한다.
      • from 절에서 alias는 select 와 다르게 as를 붙이면 안 된다.
  • N개의 테이블을 조인하려면 최소 N-1개의 조인 조건이 필요하다.

출처: 홍쌤의 데이터랩

natural join은 말 그대로 자연스러운 조인으로, 조인 조건을 적지 않는다.

자동으로 이름이 같은 컬럼을 찾아 해당 컬럼을 기준으로 조인된다.

 

cross join도 마찬가지로 조인 조건을 적지 않는다.

 N * M으로 카타시안 곱의 결과를 출력한다.

 

EQUI JOIN(등가 조인)

  • 조인 조건이 = (equal) 비교를 통해 같은 값을 가지는 행을 연결하여 결과를 얻는 조인 방법이다.
  • SQL 명령문에서 가장 많이 사용하는 조인 방법
  • from 절에 조인하고자 하는 테이블을 모두 명시
  • from 절에 명시하는 테이블은 alias 사용 가능
  • where 절에 두 테이블의 공통 칼럼에 대한 조인 조건을 나열한다.

출처: 홍쌤의 데이터 랩

NON-EQUI JOIN

  • 테이블을 연결짓는 조인 컬럼에 대한 비교 조건이 <, BETWEEN A AND B 와 같이 =이 아닌
    연산자를 사용하는 경우의 조인 조건

출처: 홍쌤의 데이터랩

예시:

출처: 홍쌤의 데이터랩

다음과 같이 sal 즉 봉급이 컬럼으로 들어간 테이블이 하나 있고

 

오른족엔 losal과 hisal이라는 컬럼이 들어간 테이블이 있다.

 

이와 같은 경우 sal이 losal와 hisal의 사이에 있다면 적절한 grade를 산정하도록 조인을 할 수 있다.

 

출처: 홍쌤의 데이터랩

세 테이블 이상의 조인

  • 관계를 잘 파악하여 모든 테이블이 연결되도록 조인 조건을 명시하자
  • N개 테이블의 경우 최소 N-1개의 조인 조건이 필요하다.

출처: 홍쌤의 데이터 랩

다음과 같이

where e.department_id = d.department_id

and d.location_id = l.location_id 로 조건만 잘 명시해주면 잘 조인된다.

 

다만 필수 조인 조건이 하나라도 생략될 경우 카타시안 곱이 발생한다.

 

self join

  • 한 테이블 내 각 행끼리 관계를 갖는 경우 조인 기법
  • 한 테이블을 참조할 때마다(필요할 때마다) 명시해야 한다.
  • 테이블 명이 중복되므로 반드시 테이블 별칭을 사용해야 한다.

출처: 홍쌤의 데이터랩

위의 테이블을 보면 한 사원의 매니저 아이디가 같은 테이블에 저장돼 있다.

 

이럴 경우 매니저 아이디와 employee 아이디가 같은 사원을 찾아 셀프 조인해야한다.

 

출처: 홍쌤의 데이터랩

위와 같이 매니저 아이디를 갖고있는 테이블이 E1로 되고 그 매니저 아이디를 통해

조인할 테이블을 E2로 표기한 후 

 

E1.MANAGER_ID = E.EMPLOYEE_ID 로 조인시키면 셀프 조인이 된다.

 

출처: 홍쌤의 데이터랩

위와 같은 예제를 보면 바로 셀프조인을 해야하는 문제라는 것을 알아차려야 한다.

 

같은 테이블의 같은 행끼리는 비교가 불가능 하기에,

셀프 조인을 통해 다른 테이블로 취급한 후 and로 조건을 붙여서 출력하면 문제를 풀 수 있다.

 

표준 조인

  • 표준 조인이란 ANSI 표준으로 작성되는 INNER, CROSS, NATURAL, OUTER JOIN을 의미한다.

INNER JOIN 

  • 내부 조인이라고 하며, 조인 조건이 일치하는 행만 추출한다.
  • ANSI 표준의 경우 from 절에 inner join 혹은 줄여서 join을 명시해야한다.
  • ANSI 표준의 경우 USING 이나 ON 조건절을 필수적으로 사용한다.

ON 절

  • 조인할 양 컬럼의 컬럼명이 서로 다르더라도 사용 가능
  • on 조건의 괄호는 옵션 (생략 가능)
  • 컬럼명이 같을 경우 테이블 이름이나 별칭을 사용하여, 명확하게 지정
  • on 조건절에서 조인 조건 명시, where 절에서는 일반 조건을 명시한다.

where 에 조인 조건을 다는 것은 ORACLE 표준이다

위의 문법은 ANSI 표준이다.

USING 조건절

  • 조인할 컬럼명이 같을 경우 사용한다.
  • ALIAS 나 테이블 이름 같은 접두어 붙이기가 불가능 하다.
  • 괄호는 필수다.

출처: 홍쌤의데이터랩

NATURAL JOIN

두 테이블 간의 동일한 이름을 갖는 모든 컬럼들에 대해 EQUI JOIN을 수행

USING, ON, WHERE 절에서 조건 정의가 불가능 하다.

JOIN에 사용된 컬럼들은 데이터 유형이 동일해야 하며 접두사를 사용 불가하다.

 

CROSS JOIN 

테이블 간 JOIN 조건이 없는 경우 생성 가능한 모든 데이터들의 조합

즉 카타시안 곱을 출력한다.

양측 테이블 행의 수를 곱한 만큼의 데이터 조합이 발생한다.

출처: 홍쌤의 데이터랩

oracle에서는 조인조건을 명시하지 않으면 자동으로 크로스 조인이 발생.

ANSI 에선 cross join을 명시해줘야 함.

 

OUTER JOIN

  • inner join과 반대인 조인방식이다.
  • join 조건에서 동일한 값이 없는 행도 반환할 때 사용한다.
  • 두 테이블 중 한 쪽에 NULL이 있으면 EQUI JOIN 시 출력되지 않는다
    이럴 때 OUTER JOIN을 사용하는 것이다.
  • LEFT, RIGHT, FULL 의 종류가 존재한다.

LEFT OUTER JOIN

  • from 절에 나열된 왼쪽 테이블에 해당하는 데이터를 읽은 후, 우측 테이블에서 join 대상을 읽어온다.
  • 즉 왼쪽 테이블이 기준이 되어 오른쪽 테이블을 가져오는 방식이다.
  • 오른쪽에서 같은 값이 없는 경우 NULL 값을 출력한다.

출처: 홍쌤의 데이터랩

 

위는 오라클 표준의 레프트 조인으로 왼쪽이니까 

오른쪽 테이블이 추가되는 형식이다. 

따라서 오른쪽 테이블에 +를 붙여주면 자동으로 left join이 실행된다.

 

출처: 홍쌤의 데이터랩

ansi 표준에서는 위와 같이 from에  left outer join을 명시하고,

on 절에 조건을 입력해줘야 한다.

 

ansi에서는 테이블 순서가 중요하다.

RIGHT OUTER JOIN

left의 반대다.

즉 오른쪽 테이블을 기준으로 왼쪽 테이블 데이터를 가져온다.

from 절의 왼쪽 오른쪽을 기준으로 구분한다.

 

FULL OUTER JOIN

두 테이블 전체기준으로 결과를 생성하여 중복 데이터는 삭제 후 리턴한다

left outer join 과 right outer join의 union 연산 결과 리턴값과 동일하다.

ORACLE 표준에는 존재하지 않음. 

출처: 홍쌤의 데이터랩

ORACLE에서 FULL OUTER JOIN을 하고 싶다면

left 와 right 조인에 union연산을 수행하면 된다.

 

참고 동영상: https://www.youtube.com/watch?v=_f_WZYuNr7A&t=2177s