▶ 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 |