조인문(JOIN)
-> 여러 테이블의 레코드를 조합하여 하나의 열로 표현 한 것
-> 두 개 이상의 테이블에서 연관성을 가지고 있는 데이터들을 따로 분류하여 새로운 가상의 테이블을 이용하여 출력
-> 서로 다른 테이블에서 각 각의 공통 값을 이용함으로써 필드를 조합
※ JOIN 시 컬럼명이 같을 경우와 다를 경우 사용법은 2가지
- Oracle 전용 구문
- ANSI 표준 구문
다를 경우
1) Oracle 전용 구문
SELECT EMP_ID,EMP_NAME,DEPT_CODE,DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;
※ Oracle 에서는 where 절을 이용하여 '='를 사용
2) ANSI 표준 구문
SELECT EMP_ID,EMP_NAME,DEPT_CODE,DEPT_TITLE
FROM EMPLOYEE JOIN DEPARTMENT ON(DEPT_CODE=DEPT_ID);
※ ANSI 표준에서는 JOIN 과 ON을 사용
같은 경우
1) Oracle 전용 구문
SELECT EMP_ID,EMP_NAME,EMPLOYEE.JOB_CODE,JOB_NAME
FROM EMPLOYEE, JOB
WHERE EMPLOYEE.JOB_CODE = JOB.JOB_CODE;
※ Oracle에서는 테이블명.컬럼명을 이용해서 작성
SELECT EMP_ID,EMP_NAME,E.JOB_CODE,JOB_NAME
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE;
※ 각 테이블의 별칭을 붙여서도 사용할 수 있다.
SELECT EMP_ID,EMP_NAME,JOB_CODE,JOB_NAME
FROM EMPLOYEE JOIN JOB USING(JOB_CODE);
※ 연결하려는 테이블의 컬럼명이 같을 경우엔 USING()을 사용
※ USING 안에 있는 컬럼명은 JOIN 된 테이블의 컬럼명
JOIN의 종류
SELECT <컬럼> FROM <테이블 A> INNER JOIN <테이블 B> ON <조건 구문>;
테이블 A의 EMP_NAME과 DEPT_CODE
SELECT EMP_NAME, DEPT_CODE FROM EMPLOYEE;
테이블 B의 DEPT_ID와 DEPT_TITLE
SELECT DEPT_ID, DEPT_TITLE FROM DEPARTMENT;
SELECT EMP_NAME,DEPT_CODE,DEPT_ID,DEPT_TITLE
FROM EMPLOYEE LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
테이블 A의 EMP_NAME 과 DEPT_CODE
SELECT EMP_NAME, DEPT_CODE FROM EMPLOYEE;
테이블 B의 DEPT_ID 와 DEPT_TITLE
SELECT DEPT_ID,DEPT_TITLE FROM DEPARTMENT;
왼쪽 조인 결과
SELECT EMP_NAME,DEPT_CODE,DEPT_ID,DEPT_TITLE
FROM EMPLOYEE LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
테이블 A의 EMP_NAME 과 DEPT_CODE
SELECT EMP_NAME, DEPT_CODE FROM EMPLOYEE;
테이블 B의 DEPT_ID 와 DEPT_TITLE
SELECT DEPT_ID, DEPT_TITLE FROM DEPARTMENT;
오른쪽 조인 결과
SELECT EMP_NAME, DEPT_TITLE FROM EMPLOYEE
RIGHT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
FULL OUTER JOIN (양쪽 외부 조인)
-> 테이블 A, 테이블 B 조건 구문에 일치하는 모든 데이터 반환
-> INDEX를 무시하고 Full Scan을 한다.
-> foreign key를 사용하는 것을 권장
완전 외부 조인 결과
SELECT EMP_NAME, DEPT_TITLE FROM EMPLOYEE
FULL JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
select employee_id, first_name, manager_id
from employees
where department_id > 80;
select a.employee_id = "사원번호”, a.first_name = "부하직원이름",
b.employee_id = "상사사번", b.first_name = "상사이름"
from employees a join employees b
on a. manager_id = b. employee_id
and a. department_id > 80;
CROSS JOIN (상호 조인)
-> 카테이션곱(Cartensian Product) 이라고도 불린다.
-> 조인 되는 테이블의 각 행들이 모두 매핑된 데이터가 검색되는 조인
-> A와 B를 서로 조인할 때, 조인 조건을 생략하고 A 테이블의 모든 행이 B 테이블의
모든 행들과 조인 되는 경우
한쪽 테이블의 모든 행과 다른쪽 테이블의 모든 행을 JOIN
- 결과는 두 테이블의 컬럼 수를 곱한 개수 출력
- 조건이 없기 때문에 A 테이블의 한 행 당 B 테이블의 모든 행이 되는 것
NON_EQUI JOIN (비등가 조인)
-> 지정한 컬럼 값이 일치하는 경우가 아닌, 값의 범위에 포함되는 행들을 연결하는 방식
-> "=" 등가 연산자가 아닌 (Between, >, <, >=, <=, <> 등) 연산자들을 사용
ex)
SELECT EMP_ID,EMP_NAME,SALARY,E.SAL_LEVEL, S.SAL_LEVEL
FROM EMPLOYEE E
JOIN SAL_GRADE S ON (E.SALARY BETWEEN 3000000 AND 4000000)
WHERE E.SAL_LEVEL = S.SAL_LEVEL
ORDER BY 1;
SELF JOIN
-> 조인은 두 개 이상의 서로 다른 테이블을 연결하기도 하지만, 같은 테이블(하나의 테이블)을 조인 하는 경우가 존재
-> 이러한 조인을 SELF JOIN
다중 JOIN
-> 여러 개의 조인문을 한번에 사용 가능
예제)
select e.first_name, d.department_name
from employees e join departments d
on e.department_id = d.department_id;
-- employees 테이블에서 first_name을 가져오고,
-- departments 테이블에서 해당하는 사원의 department_name을 가져오라는 신호가 된다.
결과)
예제)
select e.first_name, d.department_name, d.department_id
from employees e join departments d
on e.department_id = d.department_id
and e.department_id = 110;
-- employees 테이블의 first_name을 출력하고
-- departments 테이블에서 department_name과 department_id를 출력한다.
-- 조건은 department_id가 110일 것
결과)
예제)
select e.first_name, d.department_name, j.job_title
from employees e join departments d
on e.department_id = d.department_id
join jobs j
on e.job_id = j.job_id;
-- 검색 조건을 먼저 검사해서 데이터를 골라낸다.
-- 그리고 join 작업을 수행한다.
-- employees, departments, jobs 이 3개를 join해서 사원들의 first_name과 department_name, job_title을 출력
결과)