본문 바로가기

기초이론/DataBase

JOIN 이란

JOIN 이란

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

 

JOIN의 종류

  • INNER JOIN
  • NATURAL JOIN
  • SELF JOIN
  • OUTER JOIN
    • LEFT OUTER JOIN
    • RIGHT OUTER JOIN
    • FULL OUTER JOIN
  • CROSS JOIN

일반적으로 조인이라고 하면 이 정도가 전부라고 알고 있다.

그러나 위에 있는 조인들은 FROM 절의 조인 형태에 따라 구분되는 조인들이고,

추가적으로 [연산자]에 따라 분류되는 다음 조인들도 존재한다.

이들에 대해서는 간단하게만 알아볼 것이다.

  • EQUI JOIN
  • NON EQUI JOIN

1. INNER JOIN

  • JOIN 조건에서 값이 일치하는 행만 반환한다.
  • 기준 테이블과 JOIN 테이블에 중복되는 값을 보여준다.
  • 교집합


사용 형태

  • 조인 사용 형태에는 Oracle 과 ANSI 두 종류가 있다.
  • 각 테이블에 알리어스를 준 후, 해당 알리어스를 통해 어떤 테이블에서 컬럼을 추출한 것인지 구분한다.

 

- Oracle

SELECT A.컬럼명, B.컬럼명 ...
FROM CUSTOMER A, PRODUCT B
WHERE 1=1
  AND A.컬럼명 = B.컬럼명
  ...

 

- ANSI

SELECT A.컬럼명, B.컬럼명 ...
FROM CUSTONER A
INNER JOIN PRODUCT B
   ON A.컬럼명 = B.컬럼명
  AND ...

예시

테이블 CUSTOMER

 

테이블 FRUIT


위에 있는 두 가지 테이블로 조인한 결과를 확인해보자.

 

쿼리문

- Oracle

SELECT A.TRAN_NO, A.NAME, B.PRICE
FROM CUSTOMER A, FRUIT B
WHERE 1=1
  AND A.TRAN_NO = B.TRAN_NO​

 

- ANSI

SELECT A.TRAN_NO, A.NAME, B.PRICE
FROM CUSTOMER A
INNER JOIN FRUIT B
   ON A.TRAN_NO = B.TRAN_NO

 

쿼리 결과


2. NATURAL JOIN

  • 기준 테이블과 조인 테이블에서 동일한 이름을 가진 컬럼들이 자동으로 모두 조인된다.
    • 컬럼명과 타입이 전부 동일해야 한다.

 

  • NATURAL JOIN의 단점은 동일한 이름을 가지는 컬럼이 모두 조인된다는 것이다.
    • 이를 해결하기 위해 USING 문을 사용한다.

 

 

예시

테이블 EMPLOYEE

 

테이블 RANK


위에 있는 두 가지 테이블로 조인한 결과를 확인해보자.

 

쿼리문

SELECT A.NO, A.NAME, B.RANK ....
FROM EMPLOYEE A NATURAL JOIN RANK B

 

- USING

SELECT A.NO, A.NAME, B.RANK
FROM EMPLOYEE A
JOIN RANK B
USING (NAME)

 

쿼리 결과

 

- USING


3. SELF JOIN

  • 동일한 테이블을 마치 다른 테이블처럼 조인한다.

 

예시

테이블 COMPANY


COMPANY 테이블로 SELF JOIN을 해보자.

 

쿼리문

- Oracle

SELECT A.NO, A.NAME, A.RANK
FROM COMPANY A, COMPANY B
WHERE 1=1
  AND A.NO = B.SUPER

 

- ANSI

SELECT A.NO, A.NAME, A.RANK
FROM COMPANY AS A
JOIN COMPANY AS B
  ON A.NO = B.SUPER

 

쿼리 결과


4. OUTER JOIN

  • 어느 한 테이블의 데이터를 모두 가져온다.
  • 조인 조건을 만족하지 않는 데이터를 처리하기 위해 사용한다.

 

1) LEFT OUTER JOIN

  • 왼쪽에 적힌 테이블 데이터를 기준으로 OUTER JOIN을 수행한다.
  • 왼쪽에 적힌 테이블에 NULL 값 혹은 조인 조건에 일치하지 않는 값이 있어도 전부 출력한다.
  • A 전부


예시

테이블 STUDENT

 

테이블 SUBJECT


쿼리문

- Oracle

SELECT A.NO, A.NAME, B.SUM_NAME
FROM STUDENT A, SUBJECT B
WHERE 1=1
  AND A.SUB_CODE = B.SUB_CODE(+)

 

- ANSI

SELECT A.NO, A.NAME, B.SUB_NAME
FROM STUDENT A LEFT OUTER JOIN SUBJECT B
  ON A.SUB_CODE = B.SUB_CODE

 

쿼리 결과


2) RIGHT OUTER JOIN

  • 오른쪽에 적힌 테이블 데이터를 기준으로 OUTER JOIN을 수행한다.
  • 오른쪽에 적힌 테이블에 NULL 값 혹은 조인 조건에 일치하지 않는 값이 있어도 전부 출력한다.
  • B 전부


예시

테이블 STUDENT

 

테이블 SUBJECT


쿼리문

- Oracle

SELECT A.NO. A.NAME, B.SUB_NAME
FROM STUDENT A, SUBJECT B
WHERE 1=1
  AND A.SUB_CODE(+) = B.SUB_CODE

 

- ANSI

SELECT A.NO. A.NAME, B.SUB_NAME
FROM STUDENT A RIGHT OUTER JOIN SUBJECT B
  ON A.SUB_CODE = B.SUB_CODE

 

쿼리 결과


3) FULL OUTER JOIN

  • 모든 테이블의 데이터를 전부 출력한다.
  • 외부 조인의 하나로 ANSI 조인에서만 제공하는 기능이다.
  • 합집합


예시

테이블 STUDENT

 

테이블 SUBJECT


쿼리문

- ANSI

SELECT A.NO, A.NAME, B.SUB_NAME
FROM STUDENT A FULL OUTER JOIN SUBJECT B
  ON A.SUB_CODE = B.SUB_CODE

 

쿼리 결과


5. CROSS JOIN

  • 테이블 조인 시 가능한 모든 경우의 데이터를 출력한다.
  • 곱집합

예시

테이블 CUSTOMER

 

테이블 PRODUCT


쿼리문

- Oracle

SELECT A.CUS_NAME, A.PRO_CD, B.PRO_NAME
FROM CUSTOMER A, PRODUCT B

 

- ANSI

SELECT A.CUS_NAME, A.PRO_CD, B.PRO_NAME
FROM CUSTOMER A CROSS JOIN PRODUCT B

 

쿼리 결과


6. EQUI JOIN

  • INNER JOIN 은 EQUI JOIN과 NON EUQI JOIN으로 구분할 수 있다.
  • 조인 대상인 테이블들에서 컬럼값들이 정확하게 일치할 때 사용하는 JOIN이다.
  • WHERE 절에 연산자 ' = ' 를 사용해서 작성한다.
  • 해당 조인의 성능을 높이려면 INDEX 기능을 사용하는 것이 좋다.

 

예시

테이블 CUSTOMER

 

테이블 PRODUCT


쿼리문

- Oracle

SELECT A.TRAN_NO, A.NAME, B.PRODUCT, B.PRICE
FROM CUSTOMER A, PRODUCT B
WHERE A.TRAN_NO = B.TRAN_NO
  AND B.PRICE = '2000'

 

- ANSI

SELECT A.TRAN_NO, A.NAME, B.PRODUCT, B.PRICE
FROM CUSTOMER A
JOIN PRODUCT B
ON A.TRAN_NO = B.TRAN_NO
WHERE B.PRICE = '2000'

 

쿼리 결과


7. NON EQUI JOIN

  • 조인 대상 테이블들에서 어떤 컬럼 값도 일치하지 않을 때 사용한다.
  • WHERE 절에 ' = ' 외의 연산자를 사용한다.
    • 연산자 : BETWEEN [A] AND [B], IS NULL, IS NOT NULL, IN, NOT IN, <, >, >=, <= 

 

예시

테이블 STUDENT

 

테이블 GRADE


쿼리문

- Oracle

SELECT A.NAME, A.SCORE, B.GRADE
FROM STUDENT A, GRADE B
WHERE A.SCORE >= B.MIN
      AND A.SCORE <= B.MAX

 

- ANSI

SELECT A.NAME, A.SCORE, B.GRADE
FROM STUDENT A JOIN GRADE B
  ON A.SCORE BETWEEN MIN AND MAX

 

쿼리 결과

'기초이론 > DataBase' 카테고리의 다른 글

인덱스(Index)와 힌트(Hint)  (0) 2022.07.02
엘라스틱 서치(Elasticsearch)  (0) 2022.06.26
UNION 과 UNION ALL 이란  (0) 2022.03.14