고래씌

[Oracle] 4-1. DML(SELECT) - JOIN ① (INNER JOIN) 본문

Database/Oracle

[Oracle] 4-1. DML(SELECT) - JOIN ① (INNER JOIN)

고래씌 2023. 11. 24. 15:50

1. JOIN

- 두 개 이상의 테이블에서 데이터를 같이 조회하고자 할 때 사용하는 구문 => SELECT 문 이용
- 조회 결과는 하나의 결과물(RESULT SET)로 나옴

 

※ JOIN을 해야하는 이유?

- 관계형 데이터베이스에서는 최소한의 데이터로 각각의 테이블에 데이터를 보관하고 있음
- 사원정보는 사원테이블, 직급정보는 직급테이블, .. 등등 => 중복을 최소화 하기 위해
  => 즉, JOIN 구문을 이용해서 여러개 테이블 간의 "관계"를 맺어서 같이 조회해야함
  => 단, 무작정 JOIN을 하는게 아니라 테이블 간의 "연결고리"에 해당되는 칼럼을 매칭시켜서 조회

 

ex) EMPLOYEE 테이블의 JOB_CODE, JOB테이블의 JOB_CODE  => 관계가 있음

 

▶ 문법상 종류 : JOIN은 크게 "오라클 전용 구문""ANSI(미국 국립 표준 협회) 구문"으로 나뉘어짐

 

오라클 전용 구문 ANSI구문(오라클+다른 DBMS)
등가조인(EQUAL JOIN) 내부조인 (INNER JOIN) => JOIN USING/ON
포괄조인 
(LEFT OUTER JOIN)
(RIGHT OUTER JOIN)
외부조인(OUTER JOIN) => JOIN USING
왼쪽 외부조인(LEFT OUTER JOIN)
오른쪽 외부조인(RIGHT OUTER JOIN)
전체 외부조인(FULL OUTER JOIN) : 오라클 전용 구문
카테시안 곱 교차조인
자체조인(SELF JOIN)
비등가 조인(NON EQUAL JOIN)
다중조인(테이블 3개이상 JOIN)

 

 

▶ JOIN을 사용하지 않는 예

전체 사원들의 사번, 사원명, 부서코드, 부서명까지 알아내고자 한다면?

 

☞ 조인을 통해서 연결고리에 해당되는 컬럼들만 제대로 매칭시켜 마치 하나의 결과물처럼 조회 가능

 

 

 

2. 등가조인(EQUAL JOIN) / 내부조인(INNER JOIN)

: 연결시키고자 하는 칼럼의 값이 "일치하는 행들만" 조인돼서 조회

    (일치하지 않는 값들은 결과에서 제외)
    => 동등비교연산자를 제시한다.

 

 

    [표현법]
    등가조인(오라클 구문)
    SELECT 조회하고자 하는 컬럼명들 나열
    FROM 조인하고자하는 테이블명들 나열
    WHERE 연결할 컬럼에 대한 조건을 제시
    
    내부조인(ANSI 구문) : ON 구문
    SELECT 조회하고자하는 컬럼명들 나열
    FROM 기준으로 삼을 테이블명 1개 제시
    JOIN 조인할 테이블명 1개 제시 ON (연결할 칼럼에 대한 조건을 제시)
    
    내부조인(ANSI 구문) : USING 구문 => (연결할 칼럼명이 동일한 경우에만 사용)
    SELECT  조회할 칼럼명들 나열
    FROM 기준으로 삼을 테이블명 1개 제시
    JOIN 조인할 테이블명 1개만 제시 USING (연결할 칼럼명 1개만 제시)

 


EMPLOYEE 테이블

 

DEPARTMENT 테이블

 

JOB 테이블

 

 


1) 오라클 전용 구문

FROM 절에 조회할 테이블들을 나열 ,로
WHERE절에 연결고리에 대한 조건을 제시

 

 전체사원의 사번, 사원명, 부서코드, 부서명 조회

 

 

☞ 일치하지 않는 값들은 조회되지 않음.(NULL, D3, D4, D7)
☞ 두개 이상의 테이블을 조인할 때 일치하는 값이 없는 행이 결과에서 제외된 것

 

 

▶ 연결할 두 컬럼명이 같은 경우

전체 사원들의 사번, 사원명, 직급코드, 직급명

 

☞ 에러발생

어떤 테이블의 칼럼인지를 반드시 기술해줘야 한다.

 

- 방법1) 테이블명을 이용하는 방법

 

- 방법2) 테이블에 별칭을 붙여서 사용하는 방법

 


2) ANSI 구문

FROM절에 기준 테이블을 "하나만"기술 한 뒤 그 뒤에 JOIN절에서 같이 조회하고자 하는 테이블 기술, 또한 매칭시킬 컬럼에 대한 조건도 같이 기술
=> USING구문 / ON 구문

 

 

▶ 연결한 두 칼럼명이 동일한 경우

ON구문과 USING 구문 모두 사용 가능함

 

ⓐ ON구문 : 컬럼명이 애매모하다라는 에러가 발생할 수 있기 때문에 반드시 테이블명 OR 별칭을 기술

 

USING구문 : 컬럼명이 동일한 경우에만 사용 가능. 동일한 컬럼명 하나만 써주면 알아서 매칭시켜줌

 


3) NATURAL JOIN 

: 등가조인의 방법 중 하나

=> 동일한 타입과 이름을 가진 컬럼을 조인 조건으로 이용하는 방법

 

 

☞ 두 테이블간의 일치하는 칼럼이 유일하게 딱하나 존재하는데 해당 칼럼을 조인조건으로 내세움

 

 


3. 조인 시 추가적인 조건도 제시 가능하다

▶ 직급이 대리인 사원들의 정보를 조회(사번, 사원명, 월급, 직급명)

 

 

■ 오라클 전용

 

  ANSI 구문

 


※ 실습

▶ 1. 부서가 '인사관리부'인 사원들의 사번, 사원명, 보너스를 조회

- 오라클 전용구문

 

- ANSI 구문

 

 

 

2. 부서가 '총무부'가 아닌 사원들의 사번, 사원명, 급여, 입사일 조회

- 오라클 전용구문

 

- ANSI 구문

 

 

3. 보너스를 받는 사원들의 사번, 사원명, 보너스, 부서명 조회

- 오라클전용구문

 

- ANSI구문

 

 

☞ 하지만!!! 여기서 공통적으로 발견된 문제점들이 있었다.

☞ DEPT_CODE가 NULL인 사원들은 INNER JOIN으로 조회되지 않음.
즉, 부서에 배정되지 않은 사원들은 조회되지 않음

☞ 그렇다면, 일치하지 않는 행도 포함시켜서 조회를 하려면....? => 포괄조인 / 외부조인(OUTER JOIN)하는 방법이 있다!

 

(OUTER JOIN 내용 링크)

https://whalewell.tistory.com/142