230807 TIL Chapter 19. DB JOIN

최규연·2023년 8월 7일
0

TIL

목록 보기
20/57

TIL == DB JOIN

JOIN

조인은 하나 이상의 테이블에서 데이터를 조회하기 위해 사용되며 수행 결과는 하나의 Result Set으로 나온다.
참고로 JOIN은 서로 다른 테이블의 행을 하나씩 이어 붙이기 때문에 시간이 오래 걸리는 단점도 존재한다.

JOIN엔 오라클과 안시(ANSI)로 나눠져 있는데 ANSI기준으로 작성하겠다.

내부 조인 ( INNER JOIN )

ANSI 용어로 내부 조인 ( INNER JOIN ) 오라클 용어로 등가 조인 ( EQUAL JOIN )으로 연결되는 컬럼의 값이 일치하는 행들만 조인된다.
(주의점으로 일치하는 값이 없는 경우 조인에서 제외된다.)

연결에 사용하는 컬럼명이 다른 경우

  • 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, 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, E.JOB_CODE, JOB_NAME
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE;

외부 조인 ( OUTER JOIN )

두 테이블의 지정하는 컬럼값이 일치하지 않는 행도 조인에 포함을 시킨다.
반드시 OUTER JOIN임을 명시해야 한다.

LEFT [OUTER] JOIN

합치기에 사용한 두 테이블 중 왼편에 기술된 테이블의 컬럼수를 기준으로 JOIN.
왼편에 작성된 테이블의 모든 행이 결과에 포함되어야 한다. (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(+);

반대쪽 테이블 컬럼에 (+) 기호를 작성해야 한다.

RIGHT [OUTER] JOIN

합치기에 사용된 두 테이블 중 오른편에 기술된 테이블의 컬럼수를 기준으로 JOIN.

  • 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 JOIN DEPARTMENT
ON (DEPT_CODE = DEPT_ID);
  • 오라클은 (FULL OUTER JOIN 안됨.)
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID(+);

오류 내용 : SQL Error [1468][72000]: ORA-01468: outer-join된 테이블은 1개만 지정할 수 있습니다


교차 조인 ( CROSS JOIN == CARTESIAN PRODUCT )

조인되는 테이블의 각 행들이 모두 매핑된 데이터가 검색되는 방법(곱집합)
JOIN 구문을 잘못 작성하는 경우 CROSS JOIN의 결과가 조회됨

SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
CROSS JOIN DEPARTMENT;

비등가 조인( NON EQUAL JOIN )

'='(등호)를 사용하지 않는 조인문
지정한 컬럼 값이 일치하는 경우가 아닌, 값의 범위에 포함되는 행들을 연결하는 방식

SELECT EMP_NAME, SALARY, SAL_GRADE.SAL_LEVEL
FROM EMPLOYEE
JOIN SAL_GRADE ON(SALARY BETWEEN MIN_SAL AND MAX_SAL);

자체 조인 ( SELF JOIN )

같은 테이블을 조인.
자기 자신과 조인을 맺음
TIP! 같은 테이블 2개 있다고 생각하고 JOIN을 진행

  • ANSI 방식
SELECT E1.EMP_ID, E1.EMP_NAME,
		NVL(E1.MANAGER_ID, '없음'), NVL(E2.EMP_NAME,'-')
FROM EMPLOYEE E1
LEFT JOIN EMPLOYEE E2 ON(E1.MANAGER_ID = E2.EMP_ID);
  • 오라클 방식
SELECT E1.EMP_ID, E1.EMP_NAME,
		NVL(E1.MANAGER_ID, '없음'), NVL(E2.EMP_NAME,'-')
FROM EMPLOYEE E1, EMPLOYEE E2
WHERE E1.MANAGER_ID = E2.EMP_ID(+);

자연 조인 ( NATURAL JOIN)

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

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

다중 조인

N개의 테이블을 조회할 때 사용 (순서 중요!)

  • 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) + LOCATION 조인

0개의 댓글