관계형 데이터베이스에서 SQL을 이용해 테이블간 '관계'를 맺는 방법
관계형 데이터베이스는 최소한의 데이터를 테이블에 담고 있어
원하는 정보를 테이블에서 조회하려면 한 개 이상의 테이블에서
데이터를 읽어와야 되는 경우가 많다.
이 때, 테이블간 관계를 맺기 위한 연결고리 역할이 필요한데,
두 테이블에서 같은 데이터를 저장하는 컬럼이 연결고리가 됨
✍ [예시]
EMPLOYEE 테이블과 DEPARTMENT을 함께 조회하고 싶다. 이 두 테이블에서 같은 데이터를 저장하는 칼럼 (DEPT_CODE,DEPT_ID) 이 있을 때 두 테이블을 조인 하는 방법
1. SELECT EMP_ID, EMP_NAME, **DEPT_CODE**
FROM EMPLOYEE; +
2. SELECT **DEPT_ID**, DEPT_TITLE
FROM DEPARTMENT;
==>
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
연결되어 컬럼의 값이 일치하는 행들만 조인됨. (= 일치하는 값이 없는 행은 조인에서 제외)
📃 ANSI 방식 : 컬럼명이 다른 경우 ON( )을 사용
✍ 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, EMPARTMENR WHERE DEPR_CODE = DEPR_ID;
📃 ANSI 방식 : USING(컬럼명)을 사용
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;
💡 내부조인의 문제점 : 연결에 사용되는 컬럼의 값이 NULL이면 조회 결과에 포함되지 않는다!
두 테이블의 지정하는 컬럼값이 일치하지 않는 행도 조인에 포함을 시킴
반드시 OUTER JOIN임을 명시해야 함
📃 ANSI 방식
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(+); // 왼쪽 테이블 컬럼과 오른쪽 테이블 컬럼에 같은 값이 없으면 오른쪽을 억지로 추가(NULL)
📃 ANSI 방식
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;
-- ** 오라클 구문은 FULL OUTER JOIN을 사용 못함
📃 ANSI 방식
SELECT EMP_NAME, DEPT_TITLE FROM EMPLOYEE FULL OUTER JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
오라클은 FULL OUTER JOIN 불가
📃 ANSI 방식
SELECT EMP_NAME, DEPT_TITLE FROM EMPLOYEE CROSS JOIN DEPARTMENT;
SELECT EMP_NAME, SALARY, E.SAL_LEVEL, S.SAL_LEVEL FROM EMPLOYEE E JOIN SAL_GRADE S ON(SALARY BETWEEN MIN_SAL AND MAX_SAL);
📃 ANSI 방식
SELECT E.EMP_ID, E.EMP_NAME, NVL(E.MANAGER_ID,'없음'),NVL(M.EMP_NAME,'없음') FROM EMPLOYEE E LEFT JOIN EMPLOYEE M ON (E.MANAGER_ID = M.EMP_ID);
📃 오라클 방식 작성법
SELECT E.EMP_ID, E.EMP_NAME, NVL(E.MANAGER_ID,'없음'),NVL(M.EMP_NAME,'없음') FROM EMPLOYEE E , EMPLOYEE M WHERE E.MANAGER_ID = M.EMP_ID;
📃 SELECT EMP_NAME, JOB_NAME FROM EMPLOYEE -- JOIN JOB USING (JOB_CODE); // 원래 이게 정상적인 조인 코드 NATURAL JOIN JOB;
📃 ANSI 방식
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) JOIN LOCATION