6장 조인과 집합 : 여러 개의 테이블 연결하기
조인(join)이란 관계형 데이터베이스의 테이블 안에 있는 행들을 논리에 따라 연결할 수 있도록 하는 기법
사용자의 의도에 따라 조인 조건을 다양하게 넣을 수 있으며 이를 통해 출력 결과를 조작 할 수 있다.
관계형 데이터베이스의 핵심요소이다.
<조인 기법의 종류 5> p149
1. 곱집합(cartesian product): 가능한 모든 행을 조인
2. 동등 조인(equi join): 조인 조건이 정확히 일치하는 경우에 결과를 출력함
3. 비동등 조인(non equi join): 조인 조건이 정확히 일치하지 않는 경우에 결과를 출력함
4. 외부 조인(outer join): 조인 조건이 정확히 일치하지 않아도 모든 결과를 출력함
5. 자체 조인(self join): 자체 테이블에서 조인하고자 할 때 사용
SELECT *
FROM employees A, departments B
WHERE A.department_id = B.department_id;
p151~152
[예제 6-1]HR.employees 테이블과 departments 테이블과 locations 테이블을 조인하여
각 직원이 어느 부서에 속하는지와 부서의 소재지가 어디인지 조회해 보세요.
SELECT A.employee_id, A.department_id, B.department_name, C.city
FROM employees A, departments B, locations C
WHERE A.department_id = B.department_id
AND B.location_id = C.location_id;
※동등 조인은 데이터 값이 정확하게 일치하는 경우에만 결과를 출력
SELECT COUNT(*) 조인된건수
FROM employees A, departments B
WHERE A.department_id = B.department_id;
=> 106건 출력됨, 총 107건 중
p153~154 외부 조인(outer join)
[예제 6-2]HR.employees 테이블과 departments 테이블을 department_id로 외부 조인하여
department_id가 null값인 Kimberly Grant도 함께 출력해 보세요.
SELECT A.employee_id, A.first_name, A.last_name, B.department_id, B.department_name
FROM employees A, departments B
WHERE A.department_id = B.department_id(+)
ORDER BY A.employee_id;
=> A 테이블(충분한 쪽)이 기준, 데이터가 부족한 쪽(B테이블)에 (+)를 기술함, 테이블 양쪽에 (+)불가
left outer join
p155
SELECT A.employee_id, A.first_name, A.last_name, B.department_id, B.department_name
FROM employees A, departments B
WHERE A.department_id(+) = B.department_id
ORDER BY A.employee_id;
=> right outer join 예시: B테이블이 기준, A테이블이 데이터 부족한 쪽
p158~159
[예제 6-3]HR.employees 테이블을 자체 조인하여 직원별 담당자가 누구인지 조회하세요.
SELECT A.employee_id, A.first_name, A.last_name, A.manager_id,
B.first_name||' '||B.last_name manager_name
FROM employees A, employees B
WHERE A.manager_id = B.employee_id
ORDER BY A.employee_id;
P160~
UNION, UNION ALL, INTERSET, MINUS
UNION, UNION ALL, INTERSET, MINUS
p161~162, 1. UNION
[예제 6-4]HR.employees 테이블의 department_id 집합과 departments 테이블의 department_id 집합을
UNION 연산자를 이용해 합쳐 보세요.
SELECT department_id
FROM employees
UNION
SELECT department_id
FROM departments;
p162~163, 2. UNION ALL
[예제 6-5]HR.employees 테이블의 department_id 집합과 departments 테이블의 department_id 집합을
UNION_ALL 연산자를 이용해 합쳐 보세요.
SELECT department_id
FROM employees
UNION ALL
SELECT department_id
FROM departments
ORDER BY department_id;
p164, 3. INTERSECT
[예제 6-6]HR.employees 테이블의 department_id 집합과 departments 테이블의 department_id 집합의
교집합을 INTERSECT 연산자를 이용해 출력해 보세요.
SELECT department_id
FROM employees
INTERSECT
SELECT department_id
FROM departments
ORDER BY department_id;
p165~166, 4. MINUS
[예제 6-7] departments 테이블의 department_id 집합에서 HR.employees 테이블의 department_id 집합
을 MINUS 연산자를 이용해 빼 보세요.
SELECT department_id
FROM departments
MINUS
SELECT department_id
FROM HR.employees;