04. JOIN

CHOISUJIN·2023년 1월 11일
0
post-thumbnail

🔗 내부 조인 (INNER JOIN)

연결되는 컬럼의 값이 일치하는 행들만 조인됨 (== 일치하는 값이 없는 행은 조인에서 제외)

1) 연결에 사용할 두 컬럼명이 다른 경우 JOIN ON

  • ANSI 표준 구문
SELECT EMP_NO, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
  • 오라클 전용 구문
SELECT EMP_NO, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;

2) 연결에 사용할 두 컬럼명이 같은 경우 JOIN USING

  • ANSI 표준 구문
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)

두 테이블의 지정하는 컬럼값이 일치하지 않는 행도 조인에 포함을 시킴

1) LEFT [OUTER] JOIN

합치기에 사용한 두 테이블 중 왼편에 기술된 테이블의 컬럼 수를 기준으로 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(+);

2) 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;

3) FULL [OUTER] JOIN

합치기에 사용한 두 테이블이 가진 모든 행을 결과에 포함

  • ANSI 표준 구문
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
FULL JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
  • 오라클 구문 XXX
    --> 오라클에서는 FULL OUTER JOIN 사용 못함

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

※※ 잘 안씀!! (참고 정도만)
조인되는 테이블의 각 행들이 모두 매핑된 데이터가 검색되는 방법(곱집합)

  • ANSI 표준 구문
SELECT EMP_NAME , DEPT_TITLE
FROM EMPLOYEE
CROSS JOIN DEPARTMENT; -- 207행 == EMPLOYEE 23행 * DEPARTMENT 9행 == 207행

🔗 비등가 조인(NON EQUAL JOIN)

※※ 잘 안씀!! (참고 정도만)
지정한 컬럼 값이 일치하는 경우가 아닌, 값의 범위에 포함되는 행들을 연결하는 방식

  • ANSI 표준 구문
SELECT EMP_NAME , SALARY , SAL_GRADE.SAL_LEVEL 
FROM EMPLOYEE
JOIN SAL_GRADE ON(SALARY BETWEEN MIN_SAL AND MAX_SAL);

🔗 자체 조인(SELF JOIN)

자기 자신(같은 테이블)과 조인을 맺음
--> 같은 테이블 2개가 있다고 생각하기!

  • 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)

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

  • ANSI 표준 구문
SELECT EMP_NAME, JOB_NAME
FROM EMPLOYEE
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 
AND LOCATION_ID = LOCAL_CODE;
profile
매일매일 머리 터지는 중 ᕙ(•̀‸•́‶)ᕗ

0개의 댓글