JOIN 조인
1. JOIN 조인이란?

- 두 개 이상의 테이블을 서로 연결하여 데이터를 검색할 때 사용하는 방법으로
두 개의 테이블을 마치 하나의 테이블인 것처럼 보여 주는 것
2. JOIN의 기본 사용 방법
- 두 개의 테이블에 하나라도 같은 컬럼이 있어야 한다.(연결고리가 필요함)
- 두 컬럼의 값은 공유되어야 한다.
- 보통 JOIN을 위해 기본키(Primary Key)와 외래키(Foreign Key)를 활용한다.
3. Inner join

- 각 테이블에 조인 조건에 일치되는 데이터만 가져온다.
- Inner join은 교집합이라고 말한다.
SELECT *
FROM TABLE_A t1 INNER JOIN TABLE_B t2
SELECT e.EMPLOYEE_ID , e.DEPARTMENT_ID ,
d.DEPARTMENT_ID , d.DEPARTMENT_NAME
FROM EMPLOYEES e
INNER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
WHERE e.EMPLOYEE_ID = 178
;
SELECT *
FROM EMPLOYEES e
WHERE DEPARTMENT_ID IS NULL
;
4. Outer Join
- 조인 조건에 일치하는 데이터 및 일치하지 않은 데이터트를 모두 select한다
- 조인 조건이 일치하는 데이터가 없다면 NULL로 가져 온다.
- Outer Join 은 Inner Join과는 다르게 주(main)테이블이 어떤 테이블인지가 중요하다.
그래서 어떤 테이블이 중심이 되느냐에 따라 다시
Left Outer Join, Right Outer Join, Full Outer Join 으로 세분화 할 수 있다.
-left Outer Join은 왼쪽에 있는 테이블이,
Right Outer Join은 오른쪽에 있는 테이블이,
Full Outer Join은 양쪽 테이블이 모두가 중심(주)이라는 뜻이다.
5. LEFT OUTER JOIN

- 왼쪽 테이블이 기준이 된다.
- 조인 조건에 부합하는 데이터가 조인 당하는 테이블(오른쪽)에 있으면 해당 데이터를,
부재하면 NULL로 SELECT 된다.
SELECT *
FROM TABLE_A t1 LEFT OUTER JOIN TABLE_B t2
SELECT e.EMPLOYEE_ID , e.FIRST_NAME ,
d.DEPARTMENT_ID , d.DEPARTMENT_NAME
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
;
6. RIGHT OUTER JOIN

- 오른쪽 테이블이 기준이 된다.
- 조인 조건에 부합하는 데이터가 조인 당하는 테이블(왼쪽)에 있으면 해당 데이터를,
부재하면 NULL로 SELECT 된다.
SELECT *
FROM TABLE_A t1 RIGHT OUTER JOIN TABLE_B t2
SELECT e.EMPLOYEE_ID , e.FIRST_NAME ,
d.DEPARTMENT_ID , d.DEPARTMENT_NAME
FROM EMPLOYEES e
RIGHT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
;
7. FULL OUTER JOIN

- 양쪽 테이블이 기준이 된다.
- 조인 조건에 부합하는 데이터가 조인 당하는 테이블(왼쪽 또는 오른쪽)에 있으면 해당 데이터를,
부재하면 NULL로 SELECT 된다.
SELECT *
FROM TABLE_A t1 FULL OUTER JOIN TABLE_B t2
SELECT e.EMPLOYEE_ID , e.FIRST_NAME ,
d.DEPARTMENT_ID , d.DEPARTMENT_NAME
FROM EMPLOYEES e
FULL OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
;
8. ANSI Join vs Oracle Join
- SQL은 데이터베이스를 관리하기 위해 만들어진 프로그래밍 언어이며, 데이터베이스를 관리해주는
대부분의 DBMS들은 SQL을 사용한다. 물론 DBMS자체의 특수성 때문에 SQL의 사용법이 조금씩
다르기도 하지만, 큰 틀에서 보면 나름대로의 보편성을 가지고 있다.
- ANSI 미국 국립 표준 협회에서도 SQL에 대한 보편적인 문법을 제시하고 있는데, 그곳이 바로
ANSI Query이다. Join도 마찬가지로 ANSI문법을 사용하는 경우가 대부분이다.
문제
SELECT e.EMPLOYEE_ID ,e.FIRST_NAME ,e.HIRE_DATE ,jh.START_DATE , jh.END_DATE , jh.JOB_ID
FROM EMPLOYEES e
LEFT OUTER JOIN JOB_HISTORY jh
ON e.EMPLOYEE_ID = jh.EMPLOYEE_ID
;
SELECT e.FIRST_NAME , e.DEPARTMENT_ID , d.DEPARTMENT_NAME
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
;
SELECT e.FIRST_NAME , e.JOB_ID ,d.DEPARTMENT_NAME , d.DEPARTMENT_ID
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
WHERE e.DEPARTMENT_ID = 30
;
SELECT e.FIRST_NAME , e.DEPARTMENT_ID , e.JOB_ID , d.DEPARTMENT_NAME
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
WHERE e.COMMISSION_PCT IS NOT NULL
;
SELECT e.FIRST_NAME , e.JOB_ID , d.DEPARTMENT_ID , d.DEPARTMENT_NAME , d.LOCATION_ID
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
WHERE d.LOCATION_ID = 2500
;
SELECT e.FIRST_NAME , d.DEPARTMENT_NAME
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
WHERE e.FIRST_NAME LIKE '%A%'
SELECT e.EMPLOYEE_ID , e.FIRST_NAME , e2.FIRST_NAME , e.MANAGER_ID
FROM EMPLOYEES e
INNER JOIN EMPLOYEES e2
ON e.EMPLOYEE_ID = e2.MANAGER_ID
;
SELECT e.FIRST_NAME , e.SALARY, e.DEPARTMENT_ID ,d.DEPARTMENT_NAME
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
WHERE e.SALARY >= 3000
;
SELECT e.FIRST_NAME , d.DEPARTMENT_NAME
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
WHERE e.SALARY BETWEEN 3000 AND 5000
;
SELECT e.FIRST_NAME , e.SALARY ,d.LOCATION_ID EMPLOYEE_ID ,l.CITY
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
LEFT OUTER JOIN LOCATIONS l
ON d.LOCATION_ID = l.LOCATION_ID
WHERE e.SALARY <= 3000
;
SELECT d.DEPARTMENT_NAME
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
WHERE e.LAST_NAME = 'King'
AND e.FIRST_NAME = 'Steven'
;
SELECT *
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
WHERE d.DEPARTMENT_NAME = 'IT'
;
SELECT e.EMPLOYEE_ID , e.FIRST_NAME , e.JOB_ID , e.DEPARTMENT_ID
, d.DEPARTMENT_ID , d.DEPARTMENT_NAME ,d.LOCATION_ID
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
;
SELECT e.EMPLOYEE_ID , e.LAST_NAME , e.SALARY , e.DEPARTMENT_ID ,d.LOCATION_ID
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
WHERE JOB_ID LIKE 'SA_MAN'
;
SELECT e.EMPLOYEE_ID , e.FIRST_NAME , e.JOB_ID , d.DEPARTMENT_ID , d.DEPARTMENT_NAME , d.LOCATION_ID
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
;