04_JOIN

Hyunny ·2023년 5월 18일
0

SQL

목록 보기
3/11
post-thumbnail

📌 JOIN : 하나 이상의 테이블에서 데이터를 조회하기 위해 사용, 수행 결과는 하나의 RESULT SET으로 나옴

관계형 데이터베이스에서 SQL을 이용해 테이블간 '관계'를 맺는 방법
관계형 데이터베이스는 최소한의 데이터를 테이블에 담고 있어
원하는 정보를 테이블에서 조회하려면 한 개 이상의 테이블에서
데이터를 읽어와야 되는 경우가 많다.
이 때, 테이블간 관계를 맺기 위한 연결고리 역할이 필요한데,
두 테이블에서 같은 데이터를 저장하는 컬럼이 연결고리가 됨

✍ [예시]
EMPLOYEE 테이블과 DEPARTMENT을 함께 조회하고 싶다. 이 두 테이블에서 같은 데이터를 저장하는 칼럼 (DEPT_CODE,DEPT_ID) 이 있을 때 두 테이블을 조인 하는 방법

1. SELECT EMP_ID, EMP_NAME, **DEPT_CODE**
FROM EMPLOYEE; +

2. SELECT **DEPT_ID**, DEPT_TITLE
FROM DEPARTMENT;


==>

SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);

📃 내부 조인 (INNER JOIN) (== 등가 조인(EQUAL JOIN))

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

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

📃 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, EMPARTMENR
WHERE DEPR_CODE = DEPR_ID;

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

📃 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;

💡 내부조인의 문제점 : 연결에 사용되는 컬럼의 값이 NULL이면 조회 결과에 포함되지 않는다!


📃 외부 조인 (OUTER JOIN)

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

1) LEFT [OUTER] 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(+);
// 왼쪽 테이블 컬럼과 오른쪽 테이블 컬럼에 같은 값이 없으면 오른쪽을 억지로 추가(NULL)

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 : 합치기에 사용한 두 테이블이 가진 모든 행을 결과에 포함

-- ** 오라클 구문은 FULL OUTER JOIN을 사용 못함

📃 ANSI 방식

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

오라클은 FULL OUTER JOIN 불가


📃 교차 조인 (CROSS JOIN == CARTESIAN PRODUCT) : 조인되는 테이블의 각 행들이 모두 매핑된 데이터가 검색 되는 방법

📃 ANSI 방식

SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
CROSS JOIN DEPARTMENT;

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

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

📃 자체조인 (SELF JOIN) : 같은 테이블을 조인, 자기 자신과 조인을 맺음 => 똑같은 테이블 두개가 조인

📃 ANSI 방식

SELECT E.EMP_ID, E.EMP_NAME, NVL(E.MANAGER_ID,'없음'),NVL(M.EMP_NAME,'없음')
FROM EMPLOYEE E
LEFT JOIN EMPLOYEE M ON (E.MANAGER_ID = M.EMP_ID);

📃 오라클 방식 작성법

SELECT E.EMP_ID, E.EMP_NAME, NVL(E.MANAGER_ID,'없음'),NVL(M.EMP_NAME,'없음')
FROM EMPLOYEE E , EMPLOYEE M
WHERE E.MANAGER_ID = M.EMP_ID;

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

📃 SELECT EMP_NAME, JOB_NAME
FROM EMPLOYEE 
-- JOIN JOB USING (JOB_CODE); // 원래 이게 정상적인 조인 코드 
NATURAL JOIN JOB;

📃 다중 조인 : N개의 테이블을 조회할 때 사용 (순서 중요!!!) , JOIN인 순서대로 하나씩 진행된다!

📃 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) JOIN LOCATION 
profile
개발 learning ... 📝

0개의 댓글