TIL == DB JOIN
조인은 하나 이상의 테이블에서 데이터를 조회하기 위해 사용되며 수행 결과는 하나의 Result Set으로 나온다.
참고로 JOIN은 서로 다른 테이블의 행을 하나씩 이어 붙이기 때문에 시간이 오래 걸리는 단점도 존재한다.
JOIN엔 오라클과 안시(ANSI)로 나눠져 있는데 ANSI기준으로 작성하겠다.
ANSI 용어로 내부 조인 ( INNER JOIN ) 오라클 용어로 등가 조인 ( EQUAL JOIN )으로 연결되는 컬럼의 값이 일치하는 행들만 조인된다.
(주의점으로 일치하는 값이 없는 경우 조인에서 제외된다.)
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;
SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE);
SELECT EMP_ID, EMP_NAME, E.JOB_CODE, JOB_NAME
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE;
두 테이블의 지정하는 컬럼값이 일치하지 않는 행도 조인에 포함을 시킨다.
반드시 OUTER JOIN임을 명시해야 한다.
합치기에 사용한 두 테이블 중 왼편에 기술된 테이블의 컬럼수를 기준으로 JOIN.
왼편에 작성된 테이블의 모든 행이 결과에 포함되어야 한다. (JOIN이 안되는 행도 결과 포함)
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE LEFT JOIN DEPARTMENT
ON (DEPT_CODE = DEPT_ID);
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID(+);
반대쪽 테이블 컬럼에 (+) 기호를 작성해야 한다.
합치기에 사용된 두 테이블 중 오른편에 기술된 테이블의 컬럼수를 기준으로 JOIN.
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE RIGHT JOIN DEPARTMENT
ON (DEPT_CODE = DEPT_ID);
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID;
합치기에 사용한 두 테이블이 가진 모든 행을 결과에 포함.
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE FULL JOIN DEPARTMENT
ON (DEPT_CODE = DEPT_ID);
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID(+);
오류 내용 : SQL Error [1468][72000]: ORA-01468: outer-join된 테이블은 1개만 지정할 수 있습니다
조인되는 테이블의 각 행들이 모두 매핑된 데이터가 검색되는 방법(곱집합)
JOIN 구문을 잘못 작성하는 경우 CROSS JOIN의 결과가 조회됨
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
CROSS JOIN DEPARTMENT;
'='(등호)를 사용하지 않는 조인문
지정한 컬럼 값이 일치하는 경우가 아닌, 값의 범위에 포함되는 행들을 연결하는 방식
SELECT EMP_NAME, SALARY, SAL_GRADE.SAL_LEVEL
FROM EMPLOYEE
JOIN SAL_GRADE ON(SALARY BETWEEN MIN_SAL AND MAX_SAL);
같은 테이블을 조인.
자기 자신과 조인을 맺음
TIP! 같은 테이블 2개 있다고 생각하고 JOIN을 진행
SELECT E1.EMP_ID, E1.EMP_NAME,
NVL(E1.MANAGER_ID, '없음'), NVL(E2.EMP_NAME,'-')
FROM EMPLOYEE E1
LEFT JOIN EMPLOYEE E2 ON(E1.MANAGER_ID = E2.EMP_ID);
SELECT E1.EMP_ID, E1.EMP_NAME,
NVL(E1.MANAGER_ID, '없음'), NVL(E2.EMP_NAME,'-')
FROM EMPLOYEE E1, EMPLOYEE E2
WHERE E1.MANAGER_ID = E2.EMP_ID(+);
동일한 타입과 이름을 가진 컬럼이 있는 테이블 간의 조인을 간단히 표현하는 방법
반드시 두 테이블 간의 동일한 컬럼명, 타입을 가진 컬럼이 필요
SELECT EMP_NAME, JOB_NAME
FROM EMPLOYEE
-- JOIN JOB USING(JOB_CODE)
NATURAL JOIN JOB;
N개의 테이블을 조회할 때 사용 (순서 중요!)
SELECT EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
JOIN LOCATION ON (LOCATION_ID = LOCAL_CODE);
SELECT EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE, DEPARTMENT, LOCATION
WHERE DEPT_CODE = DEPT_ID -- EMPLOYEE + DEPARTMENT 조인
AND LOCATION_ID = LOCAL_CODE; -- (EMPLOYEE + DEPARTMENT) + LOCATION 조인