조인

InHwa Hong·2021년 11월 6일
0
  • RDBMS 특징 : 중복 데이터 저장 회피 목적으로 데이터 성격에 따라 테이블 분리 (예, 사원 테이블과, 부서 테이블, ... )
  • 테이블만 읽어서는 필요한 정보가 부족
  • 조인에 참여하는 테이블 간 같은 값을 가진 컬럼 -> 조인 컬럼
  • 각 테이블의 조인 컬럼 명이 같을 필요는 없으나 동일하게 만드는 것이 좋음
  • 조인 컬럼은 한 개 이상으로 구성될 수 있고 뷰(View)도 조인 가능
  • 조인 방식에 따라 크게 내부조인, 외부조인으로 구분
  • 일반 조인, ANSI 조인

조인

1. 내부조인(INNER JOIN)

  • 가장 기본적인 조인 방신

  • 조인 참여 테이블 간 조인 컬럼 값이 같은 건만 가져옴

  • 실습1 : 2개 테이블 조인

    SELECT a.employee_id	--모든 컬럼은 테이블명.컬럼명 
        , a.first_name	--혹은 Alias명.컬럼명 형태로 사용
        , a.last_name
        , a.department_id
        , b.department_name
    FROM employees a	--FROM절에 조인에 참여할 테이블 명시(콤마로 구분)
        , departments b	--각 테이블에 Alias(별칭) 주는 것이 좋음
    WHERE a.department_id = b.department_id
                --WHERE절에서 조인조건과 일반조건 함께 사용 가능 
    ORDER BY 1 ;

    ※178번 사원이 빠져 있음
    -> 사번이 178번의 department_id 값이 NULL이여서 조회되지 않음

  • 실습2 : 테이블 4개 조인

2. 외부조인(OUTER JOIN)

  • 조인 조건을 만족하는 것은 물론 만족하지 않는 데이터(로우) 까지 포함해 조회
  • 조인조건을 만족하지 않는 a 테이블의 데이터까지 조회 시
    -> WHERE a.department_id = b.department_id (+)
  • 조인조건을 만족하지 않는 b 테이블의 데이터까지 조회 시
    -> WHERE a.department_id(+) = b.department_id
  • 외부조인 시 조인조건에 (+)를 붙이는 것은 오라클 전용 문법임
  • 다른 DBMS에서는 (+) 기호 붙이면 오류 발생
  • 조인 조건 양쪽에 (+) 기호 붙일 수 없음

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

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

(+) 기호를 사용하는 오라클 외부조인 제약사항

  • 조인 컬럼이 여러개일 경우, 조인 조건에서 (+) 기호를 모두 붙여야 제데로 조회됨
    Ex) where a.col1 = b.col1(+)
    and a.col2 = b.col2(+)
  • 조인 조건 양쪽에 (+) 기호 붙일 수 없음


ANSI 조인

  • ANSI 표준 문법으로 작성한 조인 방법
  • 내부조인 : INNER JOIN
  • 외부조인 : LEFT OUTER JOIN/ RIGHT OUTER JOIN/ FULL OUTER JOIN
  • FULL OUTER JOIN은 ANSI 문법으로만 구현 가능
  • ANSI 문법은 다른DBMS에서도 사용가능 ->(+)기호는 오라클에서만 사용
  • 조인 조건 절을 WHERE 절이 아닌 FROM 절에 기술
  • 조인 조건은 ON 다음에 기술

1. 내부조인(INNER JOIN)

  • 기본문법
SELECT a.employee_id
	, a.department_id
        , b.departmnet_name
FROM employees a
INNER JOIN deparments b 
	on a.department_id = b.department_id
ORDER BY a.department_id ;
-- INNER 생략 가능

2. 외부조인(LEFT/RIGHT/FULL OUTER JOIN)

LEFT OUTER JOIN

SELECT a.employee_id
	, a.department_id
        , b.departmnet_name
FROM employees a
LEFT OUTER JOIN deparments b 
	on a.department_id = b.department_id
ORDER BY a.department_id ;
-- OUTER 생략 가능

FULL OUTER JOIN

SELECT a.employee_id
	, a.department_id
        , b.departmnet_name
FROM employees a
FULL OUTER JOIN deparments b 
	on a.department_id = b.department_id
ORDER BY a.department_id ;
-- OUTER 생략 가능

일반조인 VS ANSI 조인

  • 일반 조인을 사용해야 할까? 아니면 ANSI 조인을 써야 할까?
    -> 편한 것으로 사용
    ->But 요즘 트렌드는 ANSI 조인 이다.
    -> 따라서 ANSI 추천
  • 내부조인의 경우 일반 조인이(WHERE 절에 조인조건 기술) 가독성 측면에서 좋음

  • 외부조인
    -> (+) 는 오라클에서만 사용 가능
    -> ANSI 가 가독성이 더 좋음
    -> FULL OUTER JOIN은 ANSI 문법만 가능


셀프 조인(SELF JOIN)

  • 자기 자신과 조인
  • 동일한 테이블 끼리 조인
SELECT  a.employee_id
	, a.first_name || ' ' || a.last_name
    	, a.manager_id
    	,b.first_name || ' ' || b.last_name
FROM employees a
INNER JOIN emplyees b 
	ON a.manager_id = b.employee_id
ORDER BY 1 ;

0개의 댓글