본문으로 바로가기

JOIN의 종류

category 코딩/DataBase 2017. 2. 14. 20:19







테이블 및 데이터





JOIN 이란?


  • 2개 이상의 테이블을 연결하여 데이터를 검색하는 방법이다.

  • 보통 공통된 값인 PK 및 FK 값을 사용하여 조인한다.

  • 조인은 조인 연산자에 따라, From 절의 조인 형태에 따라서 구별한다.



JOIN의 구별



연산자에 따은 분류

  • EQUI JOIN : 두 테이블 간의 칼럼 값들이 서로 일치하는 경우 ( '=' 연산자 사용)

  • NON EQUI JOIN : 두 테이블 간의 칼럼 값들이 서로 일치하는 경우 (비교 연산자 사용)


 FROM 절의 JOIN 형태에 따른 분류 

  • INNER JOIN : JOIN 조건에서 값이 일치하는 행만 반환

  • OUTER JOIN : JOIN 조건에서 한쪽 값이 없더라도 행을 반환




INNER JOIN



INNER JOIN은 EQUI JOIN과 NON EQUI JOIN으로 구분된다.



1. EQUI JOIN (동등조인)

  • 조인 대상 테이블의 칼럼 값들이 서로 정확하게 일치하는 경우에 사용하는 JOIN으로 WHERE 절에 '=' (Equality Condition) 연산자를 사용하여 JOIN 조건을 명시한다.

  • 일반적으로 PK, FK로 지정된 칼럼을 JOIN으로 많이 사용한다.

  • EQUI JOIN의 성능을 높이려면 INDEX 기능을 사용하는 것이 좋다.



■ EQUI JOIN 구문


1
2
3
4
5
 
SELECT [테이블명1.]속성명, [테이블명2.]속성명 ....
FROM 테이블명1, 테이블명2
WHERE 테이블명1.속성명 = 테이블명2.속성명
 
cs


■ EQUI JOIN  예제

<학생> 테이블과 <학과>  테이블에서 학과코드 값이 같은 속성을 JOIN하여 학번, 이름, 학과코드, 학과명을 출력


1
2
3
4
5
 
SELECT s.S_NO, s.S_NAME, s.D_CODE, d.D_NAME
FROM STUDENT s, DEPARTMENT d
WHERE s.D_CODE = d.D_CODE;
 
cs


■ 실행 결과




조인시 테이블 간의 ','를 생략하고 INNER JOIN을 사용할 수 있으며, INNER는 생략 가능하다. JOIN 조건은 ON 절에 온다.


■ INNER JOIN 구문


1
2
3
4
5
6
 
SELECT [테이블명1.]속성명, [테이블명2.]속성명 ....
FROM 테이블명1
INNER JOIN 테이블명2
 ON 테이블명1.속성명 = 테이블명2.속성명
 
cs


■ INNER JOIN 예제 

위의 EQUI JOIN을 INNER JOIN으로 변경


1
2
3
4
5
6
 
 SELECT s.S_NO, s.S_NAME, s.D_CODE, d.D_NAME
  FROM STUDENT s
 INNER JOIN DEPARTMENT d
    ON s.D_CODE = d.D_CODE;
 
cs




2. NATURAL JOIN

  • EQUI JOIN에서 JOIN 조건이 '='일 때 동일한 속성이 두 번 나타나게 되는데, 이 중 중복을 제거하여 같은 속성을 한번만 표기하는 방식이다.

  • NATURAL JOIN은 두 테이블의 동일한 이름을 가지는 칼럼이 모두 조인된다.

  • 동일한 칼럼을 내부적으로 찾게 되므로 테이블 별칭(Alias)을 주면 오류가 발생한다.



■ NATURAL JOIN 구문


1
2
3
4
 
SELECT [테이블명1.]속성명, [테이블명2.]속성명 ....
FROM 테이블명1  NATURAL JOIN  테이블명2
 
cs


■ NATURAL JOIN 예제

<학생> 테이블과 <학과>  테이블에서 학과코드 값이 같은 속성을 JOIN하여 학번, 이름, 학과코드, 학과명을 출력


1
2
3
4
 
SELECT s.S_NO, s.S_NAME, D_CODE, d.D_NAME
  FROM STUDENT s NATURAL JOIN  DEPARTMENT d;
 
cs


■ 실행 결과





NATURAL JOIN의 단점은 동일한 이름을 가지는 칼럼은 모두 조인이 되는데, USING 문을 사용하면 칼럼을 선택해서 조인을 할 수가 있다. USING절 안에 포함되는 칼럼에 별칭(Alias)을 지정하면 오류가 발생한다.



■ JOIN ~ USING 구문


1
2
3
4
5
6
 
SELECT [테이블명1.]속성명, [테이블명2.]속성명 ....
FROM 테이블명1  
   JOIN 테이블명2
 USING(속성명)
 
cs


■ JOIN ~ USING 예제

<학생> 테이블과 <학과>  테이블에서 학과코드 값이 같은 속성을 JOIN하여 학번, 이름, 학과코드, 학과명을 출력


1
2
3
4
5
6
 
SELECT s.S_NO, s.S_NAME, D_CODE, d.D_NAME
  FROM STUDENT s
  JOIN DEPARTMENT d
 USING (D_CODE);
 
cs




3. NON EQUI JOIN

  • 조인 대상 테이블의 어떤 칼럼 값도 일치하지 않을 때 사용하며 '=' 이외의 연산자를 사용한다.

  • 사용 빈도가 매우 낮다.

  • 연산자 : BETWEEN AND, IS NULL, IS NOT NULL, IN, NOT IN,  < , >, >=, <=



■ NON EQUI JOIN 구문


1
2
3
4
5
 
SELECT [테이블명1.]속성명, [테이블명2.]속성명 ....
FROM 테이블명1, 테이블명2..
WHERE (NON EQUI JOIN 조건)
 
cs


■ NON EQUI JOIN 예제

<학생> 테이블과 <성적등급>  테이블을 JOIN하여 각 학생의 학번, 이름, 성적, 등급을 출력


1
2
3
4
5
 
SELECT s.S_NO, s.S_NAME, s.S_GRADE, g.GRADE
FROM STUDENT s, GRADE g
WHERE s.S_GRADE BETWEEN G.MIN AND G.MAX;
 
cs


■ 실행 결과





4. SELF JOIN

  • SELF JOIN은 같은 테이블에서 2개의 속성을 연결하여 EQUI JOIN을 하는 것이다.



■ SELF JOIN 구문


1
2
3
4
5
6
7
8
9
10
11
12
 
-- 방법1
SELECT [별칭1.]속성명, [별칭2.]속성명 ....
FROM 테이블명1 AS 별칭1,  테이블명2 AS 별칭2 
WHERE 별칭1.속성명 = 별칭2.속성명
 
-- 방법2
SELECT [별칭1.]속성명, [별칭2.]속성명 ....
FROM 테이블명1 AS 별칭1 
  JOIN  테이블명2 AS 별칭2 
    ON 별칭1.속성명 = 별칭2.속성명
 
cs


■ SELF JOIN 예제

<학생> 테이블을 SELF JOIN하여 선배가 있는 학생과 선배의 이름을 표시


1
2
3
4
5
 
SELECT a.S_NO AS 학번, a.S_NAME AS 이름, b.S_NAME AS 선배
FROM STUDENT a, STUDENT b
WHERE a.S_SENIOR = b.S_NO;
 
cs


■ 실행 결과






OUTER JOIN


  • 조인 조건을 만족하지 않는 데이터를 처리하기 위한 JOIN으로 INNER JOIN이 두 테이블에 있는 일치하는 값만 가져오는 것에 비해 OUTER JOIN은 어느 한 쪽의 데이터를 모두 가져온다.

  • JOIN 조건에 일치하지 않은 값을 추가 할 때 사용한다.



1. LEFT OUTER JOIN


JOIN 수행 시 왼쪽에 표기된 데이터를 기준으로 OUTER JOIN을 수행한다.



■ LEFT OUTER JOIN 구문


1
2
3
4
5
6
7
8
9
10
11
 
-- 방법1
SELECT [테이블명1.]속성명, [테이블명2.]속성명 ....
FROM 테이블명1  LEFT OUTER JOIN   테이블명2..
ON 테이블명1.속성명 = 테이블명2.속성명
 
-- 방법2
SELECT [테이블명1.]속성명, [테이블명2.]속성명 ....
FROM 테이블명1, 테이블명2
WHERE 테이블명1.속성명 = 테이블명2.속성명(+)
 
cs


■ LEFT OUTER JOIN 예제

<학생> 테이블과 <학과> 테이블에서 학과코드 값이 같은 튜플을 JOIN하여 학번, 이름, 학과코드, 학과명을 출력


1
2
3
4
5
6
7
8
9
 
-- 방법1
SELECT s.S_NO, s.S_NAME, s.D_CODE, d.D_NAME
FROM STUDENT s LEFT OUTER JOIN DEPARTMENT d
ON s.D_CODE = d.D_CODE;
 
-- 방법2
SELECT s.S_NO, s.S_NAME, s.D_CODE, d.D_NAME
FROM STUDENT s, DEPARTMENT d
WHERE s.D_CODE = d.D_CODE(+);
 
cs


■ 실행 결과





2. RIGHT OUTER JOIN 


JOIN 수행 시 오른쪽에 표기된 데이터를 기준으로 OUTER JOIN을 수행한다.



■ RIGHT OUTER JOIN 구문


1
2
3
4
5
6
7
8
9
10
11
 
-- 방법1
SELECT [테이블명1.]속성명, [테이블명2.]속성명 ....
FROM 테이블명1  RIGHT  OUTER JOIN   테이블명2..
ON 테이블명1.속성명 = 테이블명2.속성명
 
-- 방법2
SELECT [테이블명1.]속성명, [테이블명2.]속성명 ....
FROM 테이블명1, 테이블명2
WHERE 테이블명1.속성명(+= 테이블명2.속성명
 
cs


■ RIGHT OUTER JOIN 예제

<학생> 테이블과 <학과> 테이블에서 학과코드 값이 같은 튜플을 JOIN하여 학번, 이름, 학과코드, 학과명을 출력


1
2
3
4
5
6
7
8
9
10
11
 
-- 방법1
SELECT s.S_NO, s.S_NAME, s.D_CODE, d.D_NAME
FROM DEPARTMENT d RIGHT OUTER JOIN STUDENT s
ON d.D_CODE = s.D_CODE
 
-- 방법2
SELECT s.S_NO, s.S_NAME, s.D_CODE, d.D_NAME
FROM DEPARTMENT d, STUDENT s
WHERE d.D_CODE(+= s.D_CODE;
 
cs


■ 실행 결과





3. FULL OUTER JOIN 


조인 수행 시 왼쪽, 오른쪽 테이블의 모든 값을 읽어 JOIN을 수행한다. LEFT OUTER JOIN과 RIGHT OUTER JOIN의 결과를 합집합으로 처리한 결과와 동일하다.



■ FULL OUTER JOIN 구문


1
2
3
4
5
 
SELECT [테이블명1.]속성명, [테이블명2.]속성명 ....
FROM 테이블명1  FULL  OUTER JOIN   테이블명2..
ON 테이블명1.속성명 = 테이블명2.속성명
 
cs


■ FULL OUTER JOIN 예제

<학생> 테이블과 <학과> 테이블에서 학과코드 값이 같은 튜플을 JOIN하여 학번, 이름, 학과코드, 학과명을 출력, 이때 학과코드가 입력 안 된 학생이나 학과명이 없는 학과코드도 모두 출력


1
2
3
4
5
 
SELECT s.S_NO, s.S_NAME, s.D_CODE, d.D_NAME
FROM STUDENT s FULL OUTER JOIN DEPARTMENT d
ON s.D_CODE = d.D_CODE;
 
cs


■ 실행 결과






RSS구독 링크추가 트위터 이메일 구독