JOIN
두 개 이상의 테이블에서 데이터를 조회하고자 할 때 사용되는 구문
조회 결과는 하나의 결과물(RESULT SET)로 나옴
- 내부 조인 (INNER JOIN)
연결시키는 컬럼의 값이 일치하는 행들만 조인돼서 조회
>> 오라클 전용 구문
FROM 절에 조회하고자 하는 테이블을 나열하고, WHERE 절에 매칭시킬 컬럼에 대한 조건 제시
-- 사원들의 사원번호와 직원명, 직급코드, 직급명 조회
-- 테이블명을 이용하는 방법
SELECT EMP_ID, EMP_NAME, JOB.JOB_CODE, JOB_NAME
FROM EMPLOYEE, JOB
WHERE EMPLOYEE.JOB_CODE = JOB.JOB_CODE;
-- 테이블에 별칭을 부여해서 이용하는 방법
SELECT EMP_ID, EMP_NAME, J.JOB_CODE, JOB_NAME
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE;
>> ANSI 구문
FROM 절에 기준이 되는 테이블을 기술한 후
JOIN 절에 같이 조회되고자 하는 테이블 기술 + 매칭시킬 컬럼에 대한 조건 기술
* JOIN USING은 두 컬럼명이 일치할 때만 사용 가능
-- 테이블명 또는 별칭을 이용해서 하는 방법
SELECT EMP_ID, EMP_NAME, E.JOB_CODE, JOB_NAME
FROM EMPLOYEE E
JOIN JOB J ON (E.JOB_CODE = J.JOB_CODE);
-- JOIN USING 구문 사용하는 방법
SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE);
- 외부 조인 (OUTER JOIN)
두 테이블 간의 JOIN 시 일치하지 않는 행도 포함시켜서 조회 가능
단 반드시 LEFT / RIGHT 지정해야 한다 (기준이 되는 테이블)
>> LEFT [OUTER] JOIN : 두 테이블 중 왼편에 기술된 테이블 기준으로 JOIN
-- 사원명, 부서명, 급여, 연봉 조회
-- ANSI 구문
SELECT EMP_NAME, DEPT_TITLE, SALARY, SALARY * 12
FROM EMPLOYEE
LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
-- 오라클 전용 구문
SELECT EMP_NAME, DEPT_TITLE, SALARY, SALARY * 12
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID(+);
-- EMPLOYEE에 있는 건 다 조회됨
>> RIGHT [OUTER] JOIN : 두 테이블 중 오른편에 기술된 테이블을 기준으로 JOIN
-- 사원명, 부서명, 급여, 연봉 조회
-- ANSI 구문
SELECT EMP_NAME, DEPT_TITLE, SALARY, SALARY * 12
FROM EMPLOYEE
RIGHT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
-- 오라클 전용 구문
SELECT EMP_NAME, DEPT_TITLE, SALARY, SALARY * 12
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID;
-- DEPARTMENT에 있는 건 다 조회됨
>> FULL [OUTER] JOIN : 두 테이블이 가진 모든 행을 조회할 수 있음 (단, 오라클전용구문 안됨)
-- 사원명, 부서명, 급여, 연봉 조회
SELECT EMP_NAME, DEPT_TITLE, SALARY, SALARY * 12
FROM EMPLOYEE
FULL JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
- 자체 조인 (SELF JOIN)
같은 데이블을 다시 한번 조인하는 경우
-- 사번, 사원명, 부서코드, 사수의 사번, 사수명, 사수의 부서코드 조회
-- 오라클 전용 구문
SELECT E.EMP_ID, E.EMP_NAME, E.DEPT_CODE,
M.EMP_ID, M.EMP_NAME, M.DEPT_CODE
FROM EMPLOYEE E, EMPLOYEE M
WHERE E.MANAGER_ID = M.EMP_ID;
-- ANSI 구문
SELECT E.EMP_ID, E.EMP_NAME, E.DEPT_CODE,
M.EMP_ID, M.EMP_NAME, M.DEPT_CODE
FROM EMPLOYEE E
LEFT JOIN EMPLOYEE M ON (E.MANAGER_ID = M.EMP_ID);
- 다중 JOIN
2개 이상의 테이블을 JOIN 할 때
-- 사번, 사원명, 부서명, 직급명 조회
-- 오라클 전용 구문
SELECT EMP_ID, EMP_NAME, DEPT_TITLE, JOB_NAME
FROM EMPLOYEE E, DEPARTMENT D, JOB J
WHERE DEPT_CODE = DEPT_ID
AND E.JOB_CODE = J.JOB_CODE;
-- ANSI 구문
SELECT EMP_ID, EMP_NAME, DEPT_TITLE, JOB_NAME
FROM EMPLOYEE E
JOIN DEPARTMENT D ON (DEPT_CODE = DEPT_ID)
JOIN JOB USING (JOB_CODE);
-- 사번, 사원명, 부서명, 지역명 조회
-- 오라클 전용 구문
SELECT EMP_ID, EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE, DEPARTMENT, LOCATION
WHERE DEPT_CODE = DEPT_ID
AND LOCATION_ID = LOCAL_CODE;
-- ANSI 구문
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);
'Study' 카테고리의 다른 글
[Oracle/오라클] 인라인뷰 (INLINE-VIEW) / ROWNUM / RANK() OVER / DENSE_RANK() OVER (0) | 2023.01.07 |
---|---|
[Oracle/오라클] 서브쿼리 (SUBQUERY) (0) | 2023.01.02 |
[Oracle/오라클] 집합 연산자 (UNION / INTERSECT / UNION ALL / MINUS) (0) | 2023.01.02 |
[Oracle/오라클] GROUP BY / HAVING / ROLLUP (0) | 2023.01.02 |
[Oracle/오라클] 함수 (형변환 / NULL / 선택 / 그룹) (0) | 2022.12.29 |