(참고) JOIN은 서로 다른 테이블의 행을 하나씩 이어 붙이기 때문에
시간이 오래 걸림
관계형 데이터베이스에서 SQL을 이용해 테이블간 '관계'를 맺는 방법.
관계형 데이터베이스는 최소한의 데이터를 테이블에 담고 있어
원하는 정보를 테이블에서 조회하려면 한 개 이상의 테이블에서
데이터를 읽어와야 되는 경우가 많다.
이 때, 테이블간 관계를 맺기 위한 연결고리 역할이 필요한데,
두 테이블에서 같은 데이터를 저장하는 컬럼이 연결고리가됨.
(== 일치하는 값이 없는 행은 조인에서 제외됨. )
--> 포함시키고 시키면 외부조인
//1) 연결에 사용할 두 컬럼명이 다른 경우 -> ON
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
SELECT DEPT_TITLE, LOCAL_NAME
FROM DEPARTMENT
JOIN LOCATION ON (LOCATION_ID = LOCAL_CODE);
// 2) 연결에 사용할 두 컬럼명이 같은 경우 -> USING
// EMPLOYEE 테이블 + JOB 테이블 참조 하여 사번, 이름, 직급코드, 직급명 조회
SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING (JOB_CODE);
//FROM절에 쉼표(,) 로 구분하여 합치게 될 테이블명을 기술하고
//WHERE절에 합치기에 사용할 컬럼명을 명시한다
//1) 연결에 사용할 두 컬럼명이 다른 경우
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;
SELECT DEPT_TITLE, LOCAL_NAME
FROM DEPARTMENT, LOCATION
WHERE LOCATION_ID = LOCAL_CODE;
//2) 연결에 사용할 두 컬럼명이 같은 경우 -> 테이블 별로 별칭 사용
SELECT EMP_ID, EMP_NAME, E.JOB_CODE, JOB_NAME
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE;
두 테이블의 지정하는 컬럼값이 일치하지 않는 행도 조인에 포함을 시킴
--> *반드시 OUTER JOIN임을 명시해야 한다.
안시 기준 : OUTER JOIN (LEFT(왼쪽 테이블), RIGHT(오른쪽 테이블), FULL(전체 테이블)) --> OUTER
생략 가능
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
FULL OUTER JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
FULL 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_NAME, DEPT_TITLE
FROM EMPLOYEE
CROSS JOIN DEPARTMENT; -- 23 * 9
SELECT EMP_NAME, SALARY, SAL_GRADE.SAL_LEVEL
FROM EMPLOYEE
JOIN SAL_GRADE ON(SALARY BETWEEN MIN_SAL AND MAX_SAL);
TIP! 같은 테이블 2개 있다고 생각하고 JOIN을 진행
// 1) 안시 기준
SELECT A.EMP_ID, A.EMP_NAME, NVL(A.MANAGER_ID, '없음'), NVL(B.EMP_NAME,'-')
FROM EMPLOYEE A
LEFT JOIN EMPLOYEE B ON(A.MANAGER_ID = B.EMP_ID);
// 2) 오라클 기준
SELECT A.EMP_ID, A.EMP_NAME, NVL(A.MANAGER_ID, '없음'), NVL(B.EMP_NAME,'-')
FROM EMPLOYEE A, EMPLOYEE B
WHERE A.MANAGER_ID = B.EMP_ID(+);
SELECT EMP_NAME, JOB_NAME
FROM EMPLOYEE
NATURAL JOIN JOB;
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
NATURAL JOIN DEPARTMENT; --> 교차 조인
// 1) 안시 기준
SELECT EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID)
JOIN LOCATION ON(LOCATION_ID = LOCAL_CODE);
// 2) 오라클 기준
SELECT EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE, DEPARTMENT, LOCATION
WHERE DEPT_CODE = DEPT_ID AND LOCATION_ID = LOCAL_CODE; -- AND 없으면 교차조인남