📁 JOIN
하나 이상의 테이블에서 데이터를 조회하는 구문
한 테이블의 컬럼을 조건에 따라 다른 테이블의 컬럼과 연결지어 하나의 Result Set으로 출력한다.
한 테이블에 모든 데이터를 저장할 경우 구조적 비효율이 발생할 수 있다.
따라서 일반적으로는 구조의 효율성과 중복 제거를 위해 데이터를 여러 테이블에 쪼개서 저장한다.
이렇게 흩어진 데이터를 통합하여 조회해야 할 때, 테이블들을 연결하기 위해 사용하는 것이 바로 JOIN이다.
1. 내부 JOIN
연결된 컬럼들에서 서로 값이 일치하는 데이터들을 가져오는 JOIN
1) ANSI 표준 구문
JOIN 뒤에 연결할 테이블명 기술
ON 뒤에 연결할 컬럼명 기술
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
연결할 컬럼명이 서로 같은 경우 ON 대신 USING 사용
SELECT EMP_NAME, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE);
2) Oracle 전용 구문
연결할 테이블명은 .를 구분자로 하여 FROM절에 기술
엮을 조건은 WHERE절에 기술
SELECT EMP_NAME, DEPT_TITLE FROM EMPLOYEE, DEPARTMENT WHERE DEPT_CODE = DEPT_ID;
연결할 컬럼명이 서로 같을 경우 테이블명.컬럼명으로 사용
SELECT EMP_NAME, JOB_NAME
FROM EMPLOYEE, JOB
WHERE EMPLOYEE.JOB_CODE=JOB.JOB_CODE;
2. 외부 JOIN
한쪽 테이블에만 있어 서로 일치하지 않는 행도 포함하는 JOIN
- 서로 값이 일치해야 데이터를 가져오는 내부 JOIN은 NULL값을 처리하지 않음
- NULL을 처리하기 위해서는 외부 JOIN을 사용해야 함
1) ANSI 표준 구문
(1) LEFT OUTER JOIN
JOIN 왼쪽의 테이블을 기준으로 값을 가져옴
DEPT_CODE가 EMPLOYEE에 존재한다면 그것이 DEPT_ID와 일치하지 않더라도 가져오는 것
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
LEFT OUTER JOIN DEPARTMENT ON(DEPT_CODE=DEPT_ID);
(2) RIGHT OUTER JOIN
JOIN 오른쪽의 테이블을 기준으로 값을 가져옴
DEPT_ID가 DEPARTMENT에 존재한다면 그것이 DEPT_CODE와 일치하지 않더라도 가져오는 것
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
RIGHT OUTER JOIN DEPARTMENT ON(DEPT_CODE=DEPT_ID);
(3) FULL OUTER JOIN
JOIN 양측 테이블에 있는 값을 모두 가져옴
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
FULL OUTER JOIN DEPARTMENT ON(DEPT_CODE=DEPT_ID);
2) Oracle 전용 구문
- 기준을 맞춰주는 쪽에 (+)를 붙임
- ANSI 표준 구문과 달리 FULL OUTER JOIN 불가능
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID;
3. 다중 JOIN
3개 이상의 테이블을 연결할 수 있다.
1) ANSI 표준 구문
ANSI의 경우 테이블들의 순서를 반드시 유지해야 한다.
LOCATION은 DEPARTEMENT가 연결된 후에야 EMPLOYEE에 연결될 수 있기 때문이다.
SELECT EMP_ID, EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID)
JOIN LOCATION ON(LOCATION_ID = LOCAL_CODE);
2) Oracle 전용 구문
ANSI와 달리 순서를 유지하지 않아도 무방하다.
SELECT EMP_ID, EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE, DEPARTMENT, LOCATION
WHERE DEPT_CODE = DEPT_ID AND LOCATION_ID = LOCAL_CODE;