<목차>
ㅇ 등가 조인
ㅇ 포괄 조인
ㅇ 참고자료 <Do it! 오라클로 배우는 데이터베이스 입문>
(내생각) 윗도리랑 바지 이야기로 이해하면 쉬운 듯
(2개 이상의 테이블에 수행)
CF. 실제로는 이 3개가 조인조건의 종류야 (데이터가 같게/다르게/한쪽이많게)
(1개의 테이블에 수행)
ㅇ 실습
SELECT e.last_name, d.department_name, e.department_id FROM employees e, departments d WHERE e.department_id=d.department_id
106 rows selected.
CF. (내생각)
e에서는 e_id가 PK이고 d_id는 FK
d_id가 FK라는 말은 d의 d_id를 참조 정도 하겠다는 거지 무조건 사용한다는 말은 아냐.
즉, 어떤 행은 d_id 없을 수도 있어. 이런 행은 세어지지 않아.
Q. 그러면 항상 FK=PK(+) 이렇게 사용해줘야 하는 거 아닐까??
PK를 사용하지 않는 애들은 NULL 처리 돼서 언급되도록?!
A. 문제 상황에서 요구하는 게 뭔지에 따라 잘 써줘야 할 듯
-> 포괄조인 필요하다면 '모든 사원' 이런 식으로 언급해줘
-> 사원이 없더라도 '모든 부서'를 보고 싶다면 (+)FK=PK 되겠지~
ㅇ실습 : 90번 부서에 근무하는 사원 이름, 급여, 근무하는 부서이름을 출력하자.
SELECT e.last_name, d.department_name, l.city FROM employees e, departments d, locations l WHERE e.department_id=d.department_id AND d.location_id=l.location_id
Q. l.city의 l은 1인가요?
A. 알리아스는 숫자로 시작할 수 없어
내실험) 사원들 이름과 근무하는 도시를 알고 싶을 때
(즉 d 테이블에는 셀렉트절이 없어, 하지만 조인하려면 필요해)
SELECT e.last_name, l.city FROM employees e, departments d, locations l WHERE e.department_id=d.department_id AND d.location_id=l.location_id
이렇게 하면 답 잘 나와
만약 셀렉트 절에 없으니까 FROM에서 d테이블 빼버린다면? 에러나
내가 이미 조인조건에서 d.department_id 라고 d테이블의 접두어를 사용했어
이거 풀네임으로 써도 결국 프롬절에 안 쓰면 에러나SELECT e.last_name, l.city FROM employees e, locations l WHERE e.department_id = d.department_id AND d.location_id = l.location_id SQL> / ERROR at line 4: ORA-00904: "D"."LOCATION_ID": invalid identifier
Q. 테이블이 하나이면 조인할 필요가 없으니 처음부터 하나의 테이블 사용하면 되지 않나?
A1. 가능은 하지만 무결성을 보장하기 위해 테이블이 쪼개져
A2. 이게 아이러니 한 부분이야
ㅇ 실습 : 우리회사에 근무하는 모든 사원 나열하고 그 사원이 근무하고 있는 부서 이름 출력하기
(사원 빼먹지 않고 출력)
SELECT e.last_name, e.salary, d.department_name FROM employees e, departments d WHERE e.department_id=d.department_id (+)
107 rows selected.
(+) 없이 그냥 이큐 조인 한다면?
e.department_id (+) = d.department_id 로 한다면?
(부서 빼먹지 않고 출력)
122-106=16의 의미 : 사원이 없는 부서 수
27-16=11의 의미 : 사원이 있는 부서 수
ㅇ 이래서 셀렉트 문장이 어려운 거야.ㅜㅠ
내가 해석할 수 있어야 해.
테이블의 구조를 정확히 이해하고 있어야 한다는 전제가 깔려있어
ㅇ 내부, 외부조인 이름에 대해