본문 바로가기

SQL/기본 개념

JOIN

▶ JOIN

  • JOIN : 하나 이상의 테이블에서 데이터를 조회하기 위해 사용
               수행 결과는 하나의 Result Set으로 나옴
    ※ Resul Set(결과 집합) : 조회된 결과 행의 집합
  • 관계형 데이터베이스에서 SQL을 이용해 테이블간 '관계'를 맺는 방법
  • 관계형 데이터베이스는 최소한의 데이터를 테이블에 답고 있기 때문에
    원하는 정보를 조회하려면 한 개 이상의 테이블에서 데이터를 읽어오는 경우가 많음.
    이때, 테이블간 관계를 맺기 위한 연결고리 역할이 필요한데,
    두 테이블에서 같은 데이터를 저장하는 컬럼이 연결고리가 됨. 
-- EX) 기존에 서로 다른 테이블의 데이터를 조회할 경우 따로 조회함
-- 직원번호, 직원명, 부서코드 (EMPLOYEE TABLE)
-- 부서명 (DEPARTMENT TABLE) 각각 조회
SELECT EMP_ID, EMp_NAME, DEPT_CODE FROM EMPLOYEE;

SELECT DEPT_TITLE FROM DEPARTMENT;

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

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

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

  • 연결되는 컬럼의 값일치하는 행들만 JOIN됨.
    ( = 일치하는 값이 없는 행은 JOIN에서 제외됨.)
  • [주의] 동일한 컬럼명이어도 컬럼값이 다르면, JOIN 불가
              컬럼명이 달라도 컬럼값이 동일하면 JOIN 가능
  • ANSI 구문 작성방법 : USING / ON 사용
  • ORACLE 구문 작성방법 : FROM절에 쉼표(,)로 구분하여 JOIN할 테이블명을 기술하고
    WHERE절에 JOIN에 사용할 컬럼명을 명시함.

  • 1) 연결에 사용할 두 컬럼명이 다른 경우
-- EX) EMP 테이블, DEP 테이블을 참조하여 사번, 이름, 부서코드, 부서명 조회화기
SELECT EMP_ID, EMP_NAME, DEPT_CDOE, DEPT_TITLE FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);

  • EMPLOYEE 테이블의 DEPT_CODE 컬럼과 DEPARTMENT 테이블의 DEPT_ID 컬럼은
    서로 같은 부서 코드를 나타냄.
    → 이를 통해 두 테이블이 관계가 있음을 알고 JOIN을 통해서 데이터 추출이 가능함
  • ANSI 방식 : 연결에 사용할 컬럼명이 다른 경우, ON( )을 사용
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
  • ORACLE 방식 : FROM절에 사용할 테이블을 모두 작성 / WHERE절에 같은 값을 가진 컬럼을 작성

  • 2) 연결에 사용할 두 컬럼명이 같은 경우
  • ANSI 방식 : 연결에 사용할 컬럼명이 같은 경우 USING(컬럼명)을 사용
-- EX) EMP 테이블, JOB 테이블을 참조하여 사번, 이름, 직급코드, 직급명 조회
SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME FROM EMPLOYEE
JOIN JOB USING(JOB_CODE);
  • ORACLE 방식 : 별칭 사용 / 테이블별로 별칭 등록 가능
SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE;

※ WHERE JOB_CODE = JOB_CODE 로 작성할 경우, 오류 발생

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

▶ 2. 외부 조인 (OUTER JOIN)

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

  • 1) LEFT [OUTER] JOIN : JOIN에 사용한 두 테이블 중  왼편에 기술된 테이블의 컬럼 수를 기준으로 JOIN
  • ANSI 방식
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);

※ LEFT JOIN : JOIN 구문 기준으로 왼쪽에 작성된 테이블의 모든 행이 JOIN 결과에 포함되게 하는 JOIN

  • ORACLE 방식 
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID(+);
-- DEPT_CODE의 값(NULL)이 DEPT_ID의 값(D1 ~ D9)과 일치하지 않아도 추가해라
  • 2) RIGHT [OUTER] JOIN : JOIN에 사용한 두 테이블 중 오른편에 기술된 테이블의 컬럼 수를 기준으로 JOIN
  • ANSI 방식
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE RIGHT JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);

※ RIGHT JOIN : JOIN 구문 기준으로 오른쪽에 작성된 테이블의 모든 행이 JOIN 결과에 포함되게 하는 JOIN

  • ORACLE 방식
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID;
  • 3) FULL [OUTER] JOIN : JOIN에 사용한 두 테이블이 가진 모든 행을 결과에 포함
    ※ 오라클 구문은 FULL OUTER JOIN 사용 불가 [오류 발생]
  • ANSI 방식
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE FULL OUTER JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);

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

  • 교차 조인 (CROSS JOIN) : JOIN되는 테이블의 각 행이 모두 매핑된 데이터가 검색되는 방법 (곱집합)
    → JOIN 구문을 잘못 작성할 경우, 결과로 나타남

▶ 4. 비등가 조인 (NO EQUAL JOIN)

  • 비등가 조인 (NO EQUAL JOIN) : ' = '(등호)를 사용하지 않는 JOIN문
    지정한 컬럼값이 일치하는 경우가 아닌, 값의 범위에 포함되는 행들을 연결하는 방식
-- EX) 사원 급여가 SAL_LEVEL에 작성된 최소(MIN_SAL) ~ 최대(MAX_SAL) 범위 내에 있을 때만 JOIN
SELECT EMP_NAME, SALARY, E.SAL_LEVEL FROM EMPLOYEE E
JOIN SAL_GRADE S ON(SALARY BETWEEN MIN_SAL AND MAX_SAL);

▶ 자체 조인 (SELF JOIN)

  • 같은 테이블을 JOIN / 자기 자신과 JOIN을 맺음 → 동일한 테이블 2개가 JOIN
  • ANSI 방식
-- EX) 사원의 사수 정보(사수 번호 및 이름) 조회
SELECT EMP.EMP_ID 사번, EMP.EMP_NAME "사원 명", NVL(EMP.MANAGER_ID,'없음') "사수 번호", NVL(MG.EMP_NAME,'없음') "사수 명"
FROM EMPLOYEE EMP
LEFT JOIN EMPLOYEE MG ON(EMP.MANAGER_ID = MG.EMP_ID);

→ EMP 테이블에서 찾으려는 사수의 이름이 MG 테이블에 있음

  • ORACLE 방식
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(+);

▶ 6. 자연 조인 (NATURAL JOIN)

  • 자연 조인 (NATURAL JOIN) : 동일한 타입과 이름을 가진 컬럼이 있는 테이블 간 JOIN을 간단히 표현하는 방법
  • 반드시 두 테이블 간 동일한 타입과 이름을 가진 컬럼이 필요 → 없는 경우, 교차 조인이 됨
  • [주의] 자연 조인은 테이블 간에 동일한 형식을 갖는 공통 컬럼이 "반드시 하나"만 존재해야됨
SELECT EMP_NAME, JOB_NAME
FROM EMPLOYEE
-- JOIN JOB USING (JOB_CODE)
NATURAL JOIN JOB;

▶ 7. 다중 조인

  • 다중 조인 : N개의 테이블을 조회할 때 사용 (순서 중요!)
  • ★ ★ ★  JOIN 순서대로 하나씩 진행됨 ★ ★ ★
  • ANSI 방식
-- EX) EMP, DEP, LOC 테이블 JOIN하여 사원명, 부서명, 지역명 조회하기
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
    → EMPLOYEE 테이블과 DEPARTMENT 테이블을
    같은 데이터를 저장하는 컬럼으로 연결 가능
    → (EMPLOYEE 테이블 & DEPARTMENT 테이블)과 LOCATION 테이블을
    같은 데이터를 저장하는 컬럼으로 연결 가능

  • [주의] JOIN 순서를 지키지 않은 경우 오류 발생
SELECT EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE
JOIN LOCATION ON(LOCATION_ID = LOCAL_CODE) 
-- [오류 발생] EMP 테이블과 LOC 테이블은 같은 데이터를 가진 컬럼 없음
JOIN DEPARTMENT ON(DEPT_ID = DEPT_CODE);
  • ORACLE 방식
SELECT EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE, DEPARTMENT, LOCATION
WHERE DEPT_CODE = DEPT_ID -- EMPLOYEE, DEPARTMENT JOIN
AND LOCATION_ID = LOCAL_CODE; -- (EMPLOYEE + DEPARTMENT) JOIN LOCATION

'SQL > 기본 개념' 카테고리의 다른 글

DML (Data Manipulation Language) _ 데이터 조작 언어  (0) 2024.12.16
SUBQUERY(서브쿼리)  (0) 2024.12.16
GROUP BY / HAVING  (0) 2024.12.16
그룹(GROUP) 함수  (0) 2024.12.16
함수  (0) 2024.12.16