BackEnd/MySQL

[DB] JOIN

Hojung7 2024. 8. 25. 22:58

▶ JOIN

 

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

 

오라클 ANSI
등가 조인
내부 조인(INNER JOIN), JOIN USING / ON
+ 자연 조인(NATURAL JOIN, 등가 조인 방법 중 하나)
포괄 조인
왼쪽 외부 조인(LEFT OUTER), 오른쪽 외부 조인(RIGHT OUTER)
+ 전체 외부 조인(FULL OUTER, 오라클 구문으로는 사용 못함)
자체 조인, 비등가 조인 JOIN ON
카테시안(카티션) 곱
CARTESTIAN  PRODUCT
교차 조인(CROSS JOIN)

 

오라클 전용 구문  ANSI 표준 구문
FROM절에 쉼표(,) 로 구분하여 합치게 될 테이블명을 기술하고 WHERE절에 합치기에 사용할 컬럼명을 명시
- ANSI는 미국 국립 표준 협회를 뜻함, 미국의 산업표준을 제정하는 민간단체로 국제표준화기구 ISO에 가입되어있다.

- ANSI에서 제정된 표준을 ANSI라고 하고
여기서 제정한 표준 중 가장 유명한 것이 ASCII코드

 

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

 

연결되는 컬럼의 값이 일치하는 행들만 조인됨.

(= 일치하는 값이 없는 행은 조인에서 제외됨.)

 

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

EMPLOYEE 테이블, DEPARTMENT 테이블을 참조하여

사번, 이름, 부서코드, 부서명 조회

 

ANSI

SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_ID, DEPT_TITLE

FROM EMPLOYEE

JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID); -- 21행

-- 하동운, 이오리 제외

 

DEPT_CODE, DEPT_ID가 일치하는 행 끼리 한 행으로 합쳐짐

    ( 단, 일치하는 값이 없을 경우 JOIN 결과에서 제외된다!!)

INNER JOIN

 

ORACLE

SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_ID, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT 
WHERE DEPT_CODE = DEPT_ID;

 

 

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

 

 

ANSI  : 연결에 사용할 컬럼명이 같을 경우 USING(컬럼명)과 별칭을 사용

 

ORACLE  : 연결에 사용할 컬럼명이 같을 경우 별칭 사용

 

EMPLOYEE 테이블, JOB테이블을 참조하여

사번, 이름, 직급코드, 직급명 조회

 

ANSI

/* USING 사용해서 JOIN하기 */
SELECT 
	EMP_ID, 
	EMP_NAME, 
	JOB_CODE, 
	JOB_NAME
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE);


/* USING 사용 안하고 JOIN하기 */

SELECT *
FROM EMPLOYEE E -- 테이블명 별칭 (E, J)
JOIN JOB J ON(E.JOB_CODE = J.JOB_CODE);

 

ORACLE

SELECT 
	EMP_ID, 
	EMP_NAME, 
	T1.JOB_CODE, -- 어떤 테이블의 컬럼을 조회할지 별칭을 작성!
	JOB_NAME
FROM EMPLOYEE T1, JOB T2
WHERE T1.JOB_CODE = T2.JOB_CODE;

 


 

2. 외부 조인(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);

 

ORACLE

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);
-- INNER JOIN 결과에 포함되지 않았던
-- DEPARTMENT의 D3, D4, D7도 JOIN 결과에 포함

 

ORACLE

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 JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);

 


 

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

 

조인되는 테이블의 각 행들이 모두 매핑된 데이터가 검색되는 방법(곱집합)

( 직접 사용 보단 NATURAL JOIN의 실패 결과로 보여지는 모습이다! 라고 알아두는게 좋음)

 

SELECT EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
CROSS JOIN DEPARTMENT
ORDER BY EMP_NAME, DEPT_CODE;

 


 

4. 비등가 조인 (NON EQUAL JOIN) - 많이 사용 안 함!!

- '='(등호)를 사용하지 않는 조인문

 

- 지정한 컬럼 값이 일치하는 경우가 아닌, 값의 범위에 포함되는 행들을 연결하는 방식

 

사원의 급여가 SAL_LEVEL에 작성된 최소(MIN_SAL) ~ 최대(MAX_SAL)

범위의 급여가 맞을 때만 결과에 포함하겠다는 JOIN

 

→ 사원이 자신의 급여 레벨에 맞는 돈을 잘 받고 있는지 확인

 

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

 


 

5. 자체 조인 (SELF JOIN)

 

- 같은 테이블을 조인.

- 자기 자신과 조인을 맺음

 

똑같은 테이블이 2개가 있다고 생각하면 쉽다!!!

 

ANSI

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

 

ORACLE

SELECT 
	EMP.EMP_NAME "사원명", 
	NVL(EMP.MANAGER_ID , '없음') "사수 번호",
	NVL(MGR.EMP_NAME   , '없음') "사수명"
FROM 
	EMPLOYEE EMP, EMPLOYEE MGR
WHERE EMP.MANAGER_ID = MGR.EMP_ID(+);

 


 

6. 자연 조인 (NATURAL JOIN)

- 동일한 타입과 이름을 가진 컬럼이 있는 테이블 간의 조인을 간단히 표현하는 방

 

- 반드시 두 테이블 간의 동일한 컬럼명, 타입을 가진 컬럼이 필요

( 없을 경우 교차조인이 됨 )

 

[일반 INNER JOIN(USING 사용)]

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

 

 

[NATURAL JOIN]

SELECT EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE
NATURAL JOIN JOB;
--> 두 테이블에서 같은 컬럼명, 자료형을 지닌 JOB_CODE 컬럼 기준으로
--  JOIN이 진행된다

 

 


 

7. 다중 조인

 

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

 

EMPLOYEE, DEPARTMENT, LOCATION 테이블 JOIN하기


 1) EMPLOYEE(DEPT_CODE), DEPARTMENT(DEPT_ID) JOIN

 2) DEPARTMENT(LOCATION_ID), LOCATION(LOCAL_CODE) 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);

 

ORACLE

SELECT EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE, DEPARTMENT, LOCATION
WHERE DEPT_CODE = DEPT_ID
AND   LOCATION_ID = LOCAL_CODE;

 

'BackEnd > MySQL' 카테고리의 다른 글

[DB] DML (Data Manipulation Language)  (1) 2024.08.25
[DB] SUBQUERY(서브쿼리)  (0) 2024.08.25
[DB] GROUP BY, HAVING  (1) 2024.08.25
[DB]SELECT  (0) 2024.08.24
[DB]Oracle Database의 개요  (0) 2024.08.24