OracleDB - JOIN

10167 단어 oracleDatabaseDatabase

📘 JOIN

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

📜 JOIN 사용법

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

EMPLOYEE 테이블과 DEPARTMENT 테이블을 연결할 때 DEPT_CODE 컬럼과 DEPT_ID 컬럼이 같은 값을 가지고 있으므로 해당 컬럼들을 기준으로 연결한다.

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

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

작성 방법은 크게 ANSI구문과 오라클 구문으로 나뉘고 ANSI에서 USING과 ON을 쓰는 방법으로 나뉜다.

✏ ANSI와 오라클 구문 차이 예시

EMPLOYEE 테이블, DEPARTMENT 테이블을 참조하여 사번, 이름, 부서코드, 부서명 조회

-- ANSI
-- 연결에 사용할 컬럼명이 다른경우 ON()을 사용
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);

-- 오라클 (JOIN을 사용하지 않음)
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT  -- FROM절에 사용할 테이블을 모두 작성
WHERE DEPT_CODE = DEPT_ID; -- WHERE절에 같은 값을 가지고 있는 컬럼을 작성 

EMPLOYEE 테이블에 DEPT_CODE컬럼과 DEPARTMENT 테이블에 DEPT_ID 컬럼은 서로 같은 부서 코드를 나타낸다.
--> 이를 통해 두 테이블이 관계가 있음을 알고 조인을 통해 데이터 추출이 가능하다.


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

EMPLOYEE 테이블, JOB테이블을 참조하여 사번, 이름, 직급코드, 직급명 조회

-- 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임을 명시해야 한다.

✏ LEFT [OUTER] JOIN

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

SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE LEFT JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
--> JOIN 구문 기준으로 왼쪽에 작성된 테이블의 모든 행이 결과(RESULT SET)에 포함됨

-- 오라클 구문
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID(+);
-- 왼쪽 테이블 컬럼과 오른쪽 테이블 컬럼과 같은 값이 없으면
-- 억지로 추가

LEFT 조인처럼 오른편에 기술된 테이블의 컬럼 수를 기준으로 JOIN하는 RIGHT JOIN도 동일하게 사용된다.

✏ FULL [OUTER] JOIN

합치기에 사용한 두 테이블이 가진 모든 행을 결과에 포함한다.
오라클 구문은 FULL OUTER JOIN을 사용하지 못한다.

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

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

조인되는 테이블의 각 행들이 모두 매핑된 데이터가 검색되는 방법(곱집합)
--> JOIN 구문을 잘못 작성하면 결과로 나타남

SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE CROSS JOIN DEPARTMENT;

📜 비등가 조인(NON EQUAL 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)

같은 테이블을 조인하는 방법 == 자기 자신과 조인을 맺음
--> 똑같은 테이블이 2개가 조인

-- 사번, 이름, 사수 번호, 사수 이름 조회
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);

📜 다중 조인

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

-- EPLOYEE, DEPARTMENT, LOCATION 조인
-- ANSI 표준
SELECT EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID)
JOIN LOCATION ON(LOCATION_ID = LOCAL_CODE);
-- (EMPLOYEE + DEPARTMENT) JOIN LOCATION

좋은 웹페이지 즐겨찾기