[ANSI] 조인

InHwa Hong·2022년 2월 16일
0

SQL

목록 보기
6/10
  • 각 테이블의 조인 컬럼 명이 같을 필요는 없으나 동일하게 만드는 것이 좋음
  • 조인 컬럼은 한 개 이상으로 구성될 수 있고
  • 조인 방식에 따라 크게 내부조인, 외부조인으로 구분 (셀프조인도 가능)
    -내부조인 : inner join
    -외부조인 : left outer join / right outer join / full outer join

1. 내부조인 (inner join)

  • 가장 기본적인 조인
  • 조인 참여 테이블 간 조인 컬럼 값이 같은 건만 가져옴
  • 각 테이블 마다 ailas(별칭) 주기
  • 조인 조건을 만족하는 데이터만 조회됨
  • INNER 생략 가능

쿼리 예시

      SELECT a.employee_id 
          , a.first_name || ' ' || a.last_name as emp_name
          , b.department_id 
          , b.department_name
      FROM employees a # 테이블마다 별칭 주기 
      INNER JOIN departments b # inner 생략 가능 
          ON a.department_id = b.department_id #조인 조건을 만족하는 데이터만 조회됨

조회 결과 :
해석 : 사번이 178번인 Kimberely Grant는 department_id 값이 NULL 이어서 조회가 되지 않음


2. 외부조인

  • 조인 조건을 만족하는 것은 물론 만족하지 않는 데이터(로우) 까지 포함해 조회
  • OUTER 생략 가능
  • 종류 : LEFT(기준 테이블) OUTER JOIN / RIGHT(기준 테이블) OUTER JOIN / FULL OUTER JOIN

※ 외부 조인은 왜 사용할까?

  • 테이블 설계가 제대로 되어 있고, 데이터가 정확히 입력되어 있다면 굳이 외부 조인을 사용할 필요가 없음
  • 하지만 현실은 테이블 설계를 완벽히 할 수 없음
  • 애초에 제대로 설계했더라도 업무가 변경되면 로직 수정이 필요
  • 데이터 입력 시 오류로 인해 잘못된 데이터 입력, 누락 데이터 발생
    EX) 178번 Kimberely Grant는 부서번호가 없음
    -부서가 없는 사원 일까?
    -설사 부서 발령이 안되더라도 미발령부서 정보를 부서 테이블에 등록하는 것이 정상적

2-1) LEFT OUTER JOIN

쿼리 예시

      SELECT a.employee_id 
          , a.first_name || ' ' || a.last_name as emp_name
          , b.department_id 
          , b.department_name
      FROM employees a # 테이블마다 별칭 주기 
      LEFT OUTER JOIN departments b # OUTER 생략 가능 
          ON a.department_id = b.department_id 

쿼리 결과

해석: department_id 값이 NULL값이 사번이 178번 Kimberely Grant도 조회됨

2-2) RIGHT OUTER JOIN

쿼리 예시

      SELECT a.employee_id 
          , a.first_name || ' ' || a.last_name as emp_name
          , b.department_id 
          , b.department_name
      FROM employees a # 테이블마다 별칭 주기 
      LEFT OUTER JOIN departments b # OUTER 생략 가능 
          ON a.department_id = b.department_id 

3. 셀프조인

  • 자기 자신과 조인
  • 동일한 테이블 끼리 조인

쿼리 예시

# manager_id에 해당하는 사원명을 가져오기 위해 셀프조인 했음

      SELECT a.employee_id 
          , a.first_name || ' ' || a.last_name as emp_name
          , a.manager_id
          , b.first_name || ' ' || b.last_name as manager_name
      FROM employees a # 테이블마다 별칭 주기 
      INNER JOIN departments b # INNER 생략 가능 
          ON a.manager_id = b.employee_id

0개의 댓글