카테고리 없음
[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으로 대체함