JOIN
두 개 이상의 테이블을 하나로 합쳐서 결과를 조회한다.
1. EQUAL JOIN
조인은 기본이 EQUAL JOIN이다 (EQU JOIN이라고도 함)
연결되는 컬럼의 값이 일치하는 행들만 조인된다.
일치하는 값이 없는 행은 조인에서 제외 되는 것을 INNER JOIN이라고 한다.
JOIN의 기본은 INNER JOIN & EQU JOIN이다.
1-1. 오라클 전용 구문
FROM절에 ',' 로 구분하여 합치게 될 테이블명을 기술하고
WHERE절에 합치기에 사용할 컬럼명을 명시한다.
- 연결에 사용할 두 컬럼명이 다른 경우
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, DEPT_TITLE
FROM EMPLOYEE
, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;
- 연결에 사용할 두 컬럼명이 같은 경우
SELECT
EMP_ID
, EMP_NAME
, EMPLOYEE.JOB_CODE
, JOB.JOB_NAME
FROM EMPLOYEE
, JOB
WHERE EMPLOYEE.JOB_CODE = JOB.JOB_CODE;
- 테이블명에 별칭 사용
SELECT
EMP_ID
, EMP_NAME
, E.JOB_CODE
, J.JOB_NAME
FROM EMPLOYEE E
, JOB J
WHERE E.JOB_CODE = J.JOB_CODE;
1-2. ANSI 표준 구문
- USING(컬럼명) : 연결에 사용할 컬럼명이 같은 경우
SELECT
EMP_ID
, EMP_NAME
, JOB_CODE
, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE);
- ON(컬럼명) : 연결에 사용할 컬럼명이 다른 경우.
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
- 컬럼명이 같은 경우에도 ON()을 사용할 수 있다. 별칭 사용
SELECT
E.EMP_ID
, E.EMP_NAME
, E.JOB_CODE
, J.JOB_NAME
FROM EMPLOYEE E
JOIN JOB J ON(E.JOB_CODE = J.JOB_CODE);
-- 부서 테이블과 지역 테이블을 조인하여 테이블에 있는 모든 데이터를 조회하세요
-- ANSI 표준
SELECT
*
FROM DEPARTMENT D
JOIN LOCATION L ON (D.LOCATION_ID= L.LOCAL_CODE);
-- 오라클 전용
SELECT
*
FROM DEPARTMENT D
, LOCATION L
WHERE D.LOCATION_ID= L.LOCAL_CODE;
2. OUTER JOIN
두 테이블의 지정하는 컬럼 값이 일치하지 않는 행도 조인에 포함시킨다.
반드시 OUTER JOIN임을 명시해야 한다.
1. LEFT OUTER JOIN
합치기에 사용한 두 테이블 중 왼편에 기술된 테이블의 행의 수 기준으로 JOIN
-- ANSI 표준
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
-- LEFT OUTER JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
-- 오라클 전용 구문
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID(+);
2. RIGHT OUTER JOIN
합치기에 사용한 두 테이블 중 오른편에 기술된 테이블의 행의 수를 기준으로 JOIN
-- ANSI 표준 구문
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
-- RIGHT OUTER JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
RIGHT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
-- 오라클 전용 구문
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID;
3. FULL OUTER JOIN
합치기에 사용한 두 테이블이 가진 모든 행을 결과에 포함하여 JOIN
-- ANSI 표준
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
-- FULL OUTER JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
FULL JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
-- 오라클 전용 구문
-- 오라클 전용 구문으로는 FULL OUTER JOIN을 하지 못한다.
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID(+); -- 에러: outer-join된 테이블은 1개만 지정할 수 있습니다
4. CROSS JOIN
카테이션곱 이라고도 한다.
조인되는 테이블의 각 행들이 모두 매칭된 데이터가 검색되는 방법이다.
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
CROSS JOIN DEPARTMENT;
3. NON EQUAL JOIN (NON EQU JOIN)
지정한 컬럼의 값이 일치하는 경우가 아닌,
값의 범위에 포함되는 행들을 연결하는 방식
SELECT
EMP_NAME
, SALARY
, E.SAL_LEVEL "EMPLOYEE의 SAL_LEVEL"
, S.SAL_LEVEL "SAL_GRADE의 SAL_LEVEL"
FROM EMPLOYEE E
JOIN SAL_GRADE S ON(SALARY BETWEEN MIN_SAL AND MAX_SAL);
-- 오라클 전용
SELECT
EMP_NAME
, SALARY
, E.SAL_LEVEL "EMPLOYEE의 SAL_LEVEL"
, S.SAL_LEVEL "SAL_GRADE의 SAL_LEVEL"
FROM EMPLOYEE E
, SAL_GRADE S
WHERE SALARY BETWEEN MIN_SAL AND MAX_SAL;
4. SELF JOIN
같은 테이블을 조인하는 경우 자기 자신과 조인을 맺는 것이다.
-- 오라클 전용
SELECT
E1.EMP_ID
, E1.EMP_NAME 사원이름
, E1.DEPT_CODE
, E1.MANAGER_ID
, E2.EMP_NAME 관리자이름
FROM EMPLOYEE E1
, EMPLOYEE E2
WHERE E1.MANAGER_ID = E2.EMP_ID;
-- ANSI 표준
SELECT
E1.EMP_ID
, E1.EMP_NAME 사원이름
, E1.DEPT_CODE
, E1.MANAGER_ID
, E2.EMP_NAME 관리자이름
FROM EMPLOYEE E1
JOIN EMPLOYEE E2 ON(E1.MANAGER_ID = E2.EMP_ID);
5. 다중 JOIN
N개의 테이블을 조회할 때 사용
-- ANSI 표준
-- 조인 순서 중요함
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, DEPT_TITLE
, LOCAL_NAME
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
JOIN LOCATION ON (LOCATION_ID = LOCAL_CODE);
-- 오라클 전용
-- 조인 순서 상관없음
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, DEPT_TITLE
, LOCAL_NAME
FROM EMPLOYEE
, LOCATION -- 순서 상관없음
, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID
AND LOCATION_ID = LOCAL_CODE; --조건절 순서도 상관없음
-- 직급이 대리이면서 아시아 지역에 근무하는 직원 조회
-- 사번, 이름, 직급명, 부서명, 근무지역명, 급여 조회
-- (조회시에는 모든 컬럼에 테이블 별칭을 사용하는 것이 좋다)
-- ANSI 표준
SELECT
E.EMP_ID
, E.EMP_NAME
, J.JOB_NAME
, D.DEPT_TITLE
, L.LOCAL_NAME
, E.SALARY
FROM EMPLOYEE E
JOIN JOB J ON (E.JOB_CODE = J.JOB_CODE)
JOIN DEPARTMENT D ON (E.DEPT_CODE = D.DEPT_ID)
JOIN LOCATION L ON (D.LOCATION_ID = L.LOCAL_CODE)
WHERE J.JOB_NAME = '대리'
AND L.LOCAL_NAME LIKE 'ASIA%';
-- 오라클 전용
SELECT
E.EMP_ID
, E.EMP_NAME
, J.JOB_NAME
, D.DEPT_TITLE
, L.LOCAL_NAME
, E.SALARY
FROM EMPLOYEE E
, JOB J
, DEPARTMENT D
, LOCATION L
WHERE E.DEPT_CODE = D.DEPT_ID
AND E.JOB_CODE = J.JOB_CODE
AND D.LOCATION_ID = L.LOCAL_CODE
AND J.JOB_NAME = '대리'
AND L.LOCAL_NAME LIKE 'ASIA%';
'백엔드 과정 > Oracle(SQL)' 카테고리의 다른 글
[Oracle] Chap05 SUBQUERY (0) | 2022.01.21 |
---|---|
[Oracle] SQL문제풀이 / JOIN 연습문제 (1) | 2022.01.19 |
[Oracle] Chap03 GROUP BY / HAVING (0) | 2022.01.19 |
[Oracle] SQL문제풀이 / 함수 연습 문제 (0) | 2022.01.18 |
[Oracle] Chap02 그룹함수와 단일행함수 (0) | 2022.01.18 |