카테고리 없음

[Database Programming] 7. 테이블 조인(외부조인 - LEFT OUTER JOIN, RIGHT OUTER JOIN)

코딩펭귄 2024. 2. 20. 17:30

테이블조인 (외부조인) - OUTER JOIN

- inner join은 데이터가 연결되어있는(같은) 부분만 나왔지만, outer join은 교집합이 아니더라도 방향에 따라 표현해줌

1. left outer join 

- (오른쪽의 데이터를)왼쪽으로 붙임 : 왼쪽에 있는 데이터는 다 보여주되(왼쪽의 데이터를 기준으로), 데이터가없는것은 전부 null 처리함

2. right outer join (실무에서는 사용하지 않음)

 

LEFT OUTER JOIN

TABLE A  TABLE B 를 조인하여 데이터를 가져온다.

Left Outer Join  
   E left outer join D  

- 좌측에 있는(E)것이 메인테이블

- 일단, 메인테이블에만 있는 정보 + 교집합 정보 가져온다

- join에 비해 성능이 매우 떨어짐 (left outer join이 나오지않도록 많이 분리시켜주기)

  ex. 'WHERE+날짜' 로 범위지정해주기 

LEFT JOIN 예제1
부서가 존재하지 않는도시의 이름을 LEFT OUTER JOIN으로 조회한다
SELECT L.CITY
  FROM LOCATIONS L --알고싶은것 : MAIN인 LEFT JOIN의 왼쪽에 두고
  LEFT JOIN DEPARTMENTS D -- 알고있는것 : LEFT JOIN의 오른쪽에 둔다
    ON L.LOCATION_ID = D.LOCATION_ID 
 WHERE D.DEPARTMENT_ID IS NULL
 ;

LEFT JOIN 예제2

대륙에 존재하는 국가를 모두 조회한다. (대륙명과 국가명을 조회)

국가가 없을경우 NULL로 표기(=대룩이 메인테이블)한다 

SELECT C.COUNTRY_NAME 
	 , R.REGION_NAME
  FROM REGIONS R
  LEFT JOIN COUNTRIES C
    ON R.REGION_ID = C.REGION_ID
LEFT JOIN 예제3

직무명별 사원의 수를 모두 조회한다. 사원의 수가 없을경우 0으로 표기한다. (= 직무명이 메인테이블)

SELECT JOB_TITLE
	 , COUNT(EMPLOYEE_ID)
  FROM JOBS J
  LEFT JOIN EMPLOYEES E
    ON J.JOB_ID = E.JOB_ID 
 GROUP BY J.JOB_TITLE 
  ;
LEFT JOIN 예제4

근무하는사원이 단한명도 없는 도시를 조회한다

SELECT L.CITY
  FROM LOCATIONS L
  LEFT JOIN DEPARTMENTS D
    ON L.LOCATION_ID  = D.LOCATION_ID 
  LEFT JOIN EMPLOYEES E
    ON D.DEPARTMENT_ID  = E.DEPARTMENT_ID
 GROUP BY L.CITY
HAVING COUNT(E.EMPLOYEE_ID) = 0
 ;

 

 

 

 

RIGHT OUTER JOIN

TABLE B  TABLE A 를 조인하여 데이터를 가져온다

- 실무에서는 사용하지 않음. LEFT JOIN으로 대체함