참고
2020-08-24-02)외부조인.sql
외부조인 Outer Join
- 내부조인: 조인조건에 일치하지 않는 자료는 무시함
- 외부조인: 부족한 테이블에 NULL 값을 채워 조인 수행
- 일반 외부조인 형식에서 외부조인 연산자는 '(+)' 이다.
- 일반, ANSI 형식 다름
- 조인조건에서 자료의 '종류'가 부족한 쪽에 외부조인 연산자 사용
주의사항
- 외부조인 조건에 해당하는 조인조건 모두에 '(+)'을 사용 해야한다.
- 한번에 한테이블에서만 외부조인을 할 수 있다.
즉, A,B,C 테이블이 있고 A를 기준으로 B테이블을 외부조인한 경우 동시에 C를 기준으로 B테이블을 외부조인할 수 없다.
- WHERE A.COL=B.COL(+)
......AND C.COL=B.COL(+) 은 허용되지 않음
- (+)연산자가 사용된 조건과 OR, IN 연산자는 함께 사용할 수 없다
- 일반 외부조인연산자와 일반조건이 함께 사용되면 정확한 결과를 얻을 수 없다.
→ 서브쿼리나 ANSI 외부조인을 사용해야함
- COUNT 사용시 * 사용금지 (NULL값도 행으로 출력됨)
사용형식
일반 외부조인
ANSI 외부조인
- 판별방법
- 1.FROM절 테이블 정보가 더 많다 = LEFT
- 2.FROM절 테이블 정보가 더 적다 = RIGHT --> 더많은쪽에 LEFT,RIGHT해주면됨
- 3.양쪽이 서로 부족하다 = FULL
외부조인 예시
1. 모든 상품분류별 상품의 가지수를 조회하시오
- Alias : 분류코드, 분류명, 상품수
- 모든 : OUTER JOIN
- 상품분류별 : GROUP BY
- 상품의 가지수 : COUNT
일반 외부조인
1단계: 분류테이블 확인
2단계: 상품테이블에서 사용된 분류코드를 중복없이 검색
3단계: 결과
ANSI 외부조인
1,2단계 같음
3단계: 결과
RIGHT를 LEFT로 쓴다면?
- 내부조인처럼 처리됨! 실수조심!
2. 매입테이블에서 2005년 5-6월에 매입정보를 이용하여 전체상품에 대한 매입정보를 조회하시오
- Alias: 상품코드, 상품명, 매입수량, 매입금액
- 전체(모두): OUTER JOIN
- 상품별: GROUP BY
- 연도,기간: 일반조건
- 수량은 매입수량이 더많겠지만, 상품종류는 PROD가 더많음!
일반 외부조인
- 결과: 총 상품종류수인 74행이 나와야하는데 48행만 나옴
- ANSI로 조인해야함
ANSI 외부조인
실수
결과
제대로
결과
3.모든부서별 인원수를 출력하시오
일반 외부조인
결과: 사장 누락됨
ANSI 외부조인
결과: 사장 포함
외부조인 문제
1. 직무이력테이블(JOB_HISTORY)의 자료를 이용하여 모든 사원에 대하여 직무이력테이블의 사원번호와 부서코드가 현재 사원테이블의 내용과 같은 사원을 조회하시오
- Alias: 사원번호, 사원명, 직무코드, 부서코드
일반 외부조인
결과: 사장 빼고 잘 나옴
2. 2005년 전체상품에 대한 상품별 매입금액합계와 매출금액합계를 구하시오
- 단, 매입매출실적이 없으면 '0'을 출력하고 상품번호순으로 출력할 것
- Alias: 상품코드, 상품명, 매출금액, 매입금액
ANSI 외부조인
- 일반조건때문에 ANSI로 해야함
- 매출금액 0 인 캐쥬얼 벨트 포함 --> 총 74행
일반 외부조인 (사용불가)
- 매출금액 0 인 캐쥬얼 벨트가 missing --> 총 73행
멀다멀다