DB - JOIN

BroJang·2022년 9월 16일
1

DB

목록 보기
9/14

조인문(JOIN)
-> 여러 테이블의 레코드를 조합하여 하나의 열로 표현 한 것
-> 두 개 이상의 테이블에서 연관성을 가지고 있는 데이터들을 따로 분류하여 새로운 가상의 테이블을 이용하여 출력
-> 서로 다른 테이블에서 각 각의 공통 값을 이용함으로써 필드를 조합

※ JOIN 시 컬럼명이 같을 경우와 다를 경우 사용법은 2가지
- Oracle 전용 구문
- ANSI 표준 구문

  1. 다를 경우
    1) Oracle 전용 구문

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

    ※ Oracle 에서는 where 절을 이용하여 '='를 사용


    2) ANSI 표준 구문

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

    ※ ANSI 표준에서는 JOIN 과 ON을 사용

  2. 같은 경우
    1) Oracle 전용 구문

    SELECT EMP_ID,EMP_NAME,EMPLOYEE.JOB_CODE,JOB_NAME
    FROM EMPLOYEE, JOB 
    WHERE EMPLOYEE.JOB_CODE = JOB.JOB_CODE;

    ※ Oracle에서는 테이블명.컬럼명을 이용해서 작성

    SELECT EMP_ID,EMP_NAME,E.JOB_CODE,JOB_NAME
    FROM EMPLOYEE E, JOB J
    WHERE E.JOB_CODE = J.JOB_CODE;

    ※ 각 테이블의 별칭을 붙여서도 사용할 수 있다.


  • ANSI 표준 구문
SELECT EMP_ID,EMP_NAME,JOB_CODE,JOB_NAME
FROM EMPLOYEE JOIN JOB USING(JOB_CODE);

※ 연결하려는 테이블의 컬럼명이 같을 경우엔 USING()을 사용
※ USING 안에 있는 컬럼명은 JOIN 된 테이블의 컬럼명


JOIN의 종류

  • INNER JOIN(내부 조인) : 교집합 (일반적으로 사용하는 JOIN)
  • OUTER JOIN(외부 조인) : 합집합
    1. LEFT OUTER JOIN (왼쪽 외부 조인)
    2. RIGHT OUTER JOIN (오른쪽 외부 조인)
    3. FULL OUTER JOIN (완전 외부 조인)

  1. INNER JOIN
    -> 테이블 A와 테이블 B 모두 조건 구문에 일치하는 ROW만 반환
    -> 즉, 데이터가 존재할 경우에만 적용
SELECT <컬럼> FROM <테이블 A> INNER JOIN <테이블 B> ON <조건 구문>;

테이블 A의 EMP_NAME과 DEPT_CODE

SELECT EMP_NAME, DEPT_CODE FROM EMPLOYEE;

테이블 B의 DEPT_ID와 DEPT_TITLE

SELECT DEPT_ID, DEPT_TITLE FROM DEPARTMENT;
  1. LEFT OUT JOIN (왼쪽 외부 조인)
    -> 테이블 A 모두 반환(조건절 기준 왼쪽)
    -> 테이블 B 조건 구문에 일치하는 데이터만 반환
    -> 간단하게 Outer join의 경우 여러 개의 테이블에서 한쪽 테이블에는 데이터가 있고 나머지 한쪽 테이블에는 데이터가 없을 때, 데이터가 있는 쪽의 내용을 전부 출력하게 하는 방법.
SELECT EMP_NAME,DEPT_CODE,DEPT_ID,DEPT_TITLE
FROM EMPLOYEE LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);

테이블 A의 EMP_NAME 과 DEPT_CODE

SELECT EMP_NAME, DEPT_CODE FROM EMPLOYEE;

테이블 B의 DEPT_ID 와 DEPT_TITLE

SELECT DEPT_ID,DEPT_TITLE FROM DEPARTMENT;

왼쪽 조인 결과

SELECT EMP_NAME,DEPT_CODE,DEPT_ID,DEPT_TITLE
FROM EMPLOYEE LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
  1. RIGHT OUTER JOIN (오른쪽 외부 조인)
    -> 테이블 B 모두 반환(조건절 기준 오른쪽)
    -> 테이블 A 조건 구문에 일치하는 데이터만 반환

테이블 A의 EMP_NAME 과 DEPT_CODE

SELECT EMP_NAME, DEPT_CODE FROM EMPLOYEE;

테이블 B의 DEPT_ID 와 DEPT_TITLE

SELECT DEPT_ID, DEPT_TITLE FROM DEPARTMENT;

오른쪽 조인 결과

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

FULL OUTER JOIN (양쪽 외부 조인)
-> 테이블 A, 테이블 B 조건 구문에 일치하는 모든 데이터 반환
-> INDEX를 무시하고 Full Scan을 한다.
-> foreign key를 사용하는 것을 권장

완전 외부 조인 결과

SELECT EMP_NAME, DEPT_TITLE FROM EMPLOYEE
FULL JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
select employee_id, first_name, manager_id
from employees
where department_id > 80;

select a.employee_id = "사원번호”, a.first_name = "부하직원이름",
   b.employee_id = "상사사번", b.first_name = "상사이름"
from employees a join employees b
on a. manager_id = b. employee_id
and a. department_id > 80;

CROSS JOIN (상호 조인)
-> 카테이션곱(Cartensian Product) 이라고도 불린다.
-> 조인 되는 테이블의 각 행들이 모두 매핑된 데이터가 검색되는 조인
-> A와 B를 서로 조인할 때, 조인 조건을 생략하고 A 테이블의 모든 행이 B 테이블의
모든 행들과 조인 되는 경우

한쪽 테이블의 모든 행과 다른쪽 테이블의 모든 행을 JOIN
- 결과는 두 테이블의 컬럼 수를 곱한 개수 출력
- 조건이 없기 때문에 A 테이블의 한 행 당 B 테이블의 모든 행이 되는 것

NON_EQUI JOIN (비등가 조인)
-> 지정한 컬럼 값이 일치하는 경우가 아닌, 값의 범위에 포함되는 행들을 연결하는 방식
-> "=" 등가 연산자가 아닌 (Between, >, <, >=, <=, <> 등) 연산자들을 사용

ex)

SELECT EMP_ID,EMP_NAME,SALARY,E.SAL_LEVEL, S.SAL_LEVEL
FROM EMPLOYEE E
JOIN SAL_GRADE S ON (E.SALARY BETWEEN 3000000 AND 4000000)
WHERE E.SAL_LEVEL = S.SAL_LEVEL
ORDER BY 1;

SELF JOIN
-> 조인은 두 개 이상의 서로 다른 테이블을 연결하기도 하지만, 같은 테이블(하나의 테이블)을 조인 하는 경우가 존재
-> 이러한 조인을 SELF JOIN

다중 JOIN
-> 여러 개의 조인문을 한번에 사용 가능

예제)

select e.first_name, d.department_name
from employees e join departments d
on e.department_id = d.department_id;
-- employees 테이블에서 first_name을 가져오고, 
-- departments 테이블에서 해당하는 사원의 department_name을 가져오라는 신호가 된다.

결과)



예제)

select e.first_name, d.department_name, d.department_id
from employees e join departments d
on e.department_id = d.department_id
and e.department_id = 110;
-- employees 테이블의 first_name을 출력하고
-- departments 테이블에서 department_name과 department_id를 출력한다.
-- 조건은 department_id가 110일 것

결과)

예제)

select e.first_name, d.department_name, j.job_title
from employees e join departments d
on e.department_id = d.department_id
join jobs j
on e.job_id = j.job_id;
-- 검색 조건을 먼저 검사해서 데이터를 골라낸다.
-- 그리고 join 작업을 수행한다.
-- employees, departments, jobs 이 3개를 join해서 사원들의 first_name과 department_name, job_title을 출력

결과)

profile
끊임없이 배우고 진보하는 백엔드 개발자입니다. 배움에 있어서 최선을 다하자!

0개의 댓글