Part 5. JOIN

Hyunsu·2023년 3월 12일
0

국비 교육

목록 보기
28/36
post-thumbnail

INNER JOIN 과 OUTER JOIN 및 SELF JOIN 은 꼭 알아두어야 한다.
CROSS JOIN 과 NON EQU JOIN 은 사용할 일이 거의 없다.

📝 목차

  1. 오라클 전용 구문
  2. ANSI 표준 구문
  3. INNER JOIN - 내부 조인 또는 등가 조인
  4. OUTER JOIN - 외부 조인 또는 등가 조인
  5. CROSS JOIN - 교차 조인
  6. NON EQU JOIN - 비등가 조인
  7. SELF JOIN - 자체 조인
  8. 다중 조인
  9. 자연 조인

하나 이상의 테이블에서 데이터를 조회하기 위해 사용하며
수행 결과는 하나의 Result Set 으로 나온다.

1. 오라클 전용 구문

WHERE 절을 이용하며 JOIN 단어는 사용하지 않는다.


2. ANSI 표준 구문

ANSI 는 American National Standards Institute 의 약자로
호환성이 좋기 때문에 주로 사용한다.

서로 같은 값을 가지고 있는 컬럼이다라고 명시하는 문장이다.

JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);

다음은 내부 조인과 외부 조인이다.
오라클 방식과 ANSI 방식으로 사용할 수 있다.

3. INNER JOIN

연결되는 컬럼의 값이 일치하는 행들만 조인된다.
이 때 일치하는 값이 없는 행은 조인에서 제외된다. 따라서 NULL 값은 제외된다.

📌 연결에 사용할 두 컬럼명이 다른 경우

-- ANSI : ON 사용
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_ID, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);

-- 오라클 : JOIN 단어를 작성하지않음
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_ID, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;

📌 연결에 사용할 두 컬럼명이 같은 경우

-- ANSI : USING 사용
SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE);

SELECT EMP_ID, EMP_NAME, EMPLOYEE.JOB_CODE, JOB_NAME
FROM EMPLOYEE
JOIN JOB ON (EMPLOYEE.JOB_CODE = JOB.JOB_CODE);

-- 오라클 : 별칭 사용
SELECT EMP_ID, EMP_NAME, E.JOB_CODE, JOB_NAME
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE;


4. OUTER JOIN

두 테이블의 지정하는 컬럼값이 일치하지 않는 행도 조인에 포함을 시킨다.
따라서 NULL 값을 포함한다.

📌 LEFT OUTER JOIN

합치기에 사용한 두 테이블 중 왼편에 기술된 테이블의 컬럼 수를 기준으로 조인한다.
즉 왼편에 기술된 모든 컬럼이 최종 결과에 포함되어야 한다.

-- ANSI
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE LEFT /* OUTER */ JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);

-- 오라클
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID(+);

오라클 구문은 왼쪽 테이블 컬럼의 값과 오른쪽 테이블 컬럼의 값이 일치하지 않아도 억지로 추가해라 라고 해석하면 된다.

📌 RIGHT OUTER JOIN

합치기에 사용한 두 테이블 중 오른편에 기술된 테이블의 컬럼 수를 기준으로 조인한다.
즉 오른편에 기술된 모든 컬럼이 최종 결과에 포함되어야 한다.

-- ANSI
SELECT EMP_NAME, DEPT_CODE, DEPT_ID, DEPT_TITLE
FROM EMPLOYEE /* OUTER */ RIGHT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);

-- 오라클
SELECT EMP_NAME, DEPT_CODE, DEPT_ID, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID;

📌 FULL OUTER JOIN

합치기에 사용한 두 테이블이 가진 모든 행을 결과에 포함한다.
즉 양쪽 테이블에서 INNER JOIN 에 포함되지 못한 행 모두를 결과에 포함한다.

-- ANSI
SELECT EMP_NAME, DEPT_CODE, DEPT_ID, DEPT_TITLE
FROM EMPLOYEE FULL JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);

-- 오라클 구문에서는 지원하지 않음

5. CROSS JOIN

조인되는 테이블의 각 행들이 모두 매핑된 데이터가 검색되는 방법이다.
즉 모든 경우의 수를 만들어준다.


6. NON EQU JOIN

비등가 조인으로 등호를 사용하지 않는다.
지정한 컬럼 값이 일치하는 경우가 아닌 값의 범위에 포함되는 행들을 연결하는 방식이다.

예를 들어 EMPLOYEE 테이블에서 선동일씨의 SALARY 값인 800 을 가져와서 이 값이 BETWEEN 문으로 나타낸 범위 중 어디에 있는 것인지 묻고 해당 범위에 맞다면 조인해서 보여준다.


7. SELF JOIN

같은 테이블을 조인하는 것으로 자기 자신과 조인을 맺는다.
하나의 테이블 가지고 생각하지 말고 같은 테이블이 두 개 있다고 생각하면 쉽다.

사용법은 다음과 같다.

-- ANSI
SELECT EMP.EMP_ID, EMP.EMP_NAME, NVL(EMP.MANAGER_ID, '없음'), NVL(MGR.EMP_NAME, '없음')
FROM EMPLOYEE EMP
LEFT JOIN EMPLOYEE MGR ON(EMP.MANAGER_ID = MGR.EMP_ID);

-- 오라클
SELECT EMP.EMP_ID, EMP.EMP_NAME, NVL(EMP.MANAGER_ID, '없음'), NVL(MGR.EMP_NAME, '없음')
FROM EMPLOYEE EMP, EMPLOYEE MGR
WHERE EMP.MANAGER_ID = MGR.EMP_ID(+);

8. 다중 조인

N 개의 테이블을 조회할 때 사용하며 순서가 중요하다.


9. 자연 조인

동일한 타입과 이름을 가진 컬럼이 있는 테이블 간의 조인을 표현하는 방법이다.
반드시 두 테이블 간의 동일한 컬럼명과 타입을 가진 컬럼이 필요하다.

-- NATURAL JOIN 성립
SELECT EMP_NAME, JOB_NAME
FROM EMPLOYEE
-- JOIN JOB USING(JOB_CODE);
NATURAL JOIN JOB;

-- NATURAL JOIN 성립 불가
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
NATURAL JOIN DEPARTMENT;
profile
현수의 개발 저장소

0개의 댓글