본문 바로가기
SQL

SQL_Join

by 유서담 2023. 12. 13.

Join

 

  • 조인은 두 개 이상의 테이블을 연결지어서 데이터를 조회하는 것이다.
    • 오라클과 같은 관계형데이터베이스는 모든 정보를 하나의 테이블에 저장하는 것이 아니라, 데이터가 정규화되어 여러 테이블에 분산되어 있다.
    • 데이터가 여러 테이블에 흩어져 있기 때문에 사용자가 원하는 데이터를 찾기위해서는 여러 테이블을 다 조회해야 한다.
  • 조인은 여러 테이블에 흩어져 있는 정보중에서 사용자가 원하는 정보만 가져와서 가상의 테이블처럼 만들어서 데이터를 조회하는 것이다.

 

Join의 예

 

  • 사원테이블에는 사번, 이름, 소속부서번호가 있다
  • 부서테이블에는 부서번호, 부서명, 위치가 있다
  • 아래와 같이 사원테이블에서 사원의 이름을 가져오고, 부서테이블에서 그 사원이 소속된 부서명을 조회해야 한다
  • 사원테이블과 부서테이블의 각각의 행을 서로 연관있는 행끼리 연결지어서 새로운 가상의 테이블을 만들고, 그 테이블로부터 필요한 정보를 가져오는 것이다

Join 예시

 

 

 

 

Join의 방법

 

 

Oracle Join

  SELECT a.col1, b.col2
  FROM table1 a, table2 b
  WHERE a.col2 = b.col2; -- Join 조건

 

 

ANSI Join

  SELECT a.col1, b.col2
  FROM table1 a [INNER] JOIN table2 b
  ON a.col2 = b.col2

 

 

  • 조인문법은 오라클에서만 사용되는 Oracle Join과 모든 RDBMS에서 공통적으로 사용하는 ANSI(표준) Join이 있다
  • 조인이 수행될 때는 두 개 이상의 테이블이 사용되는데, 둘 중에 먼저 읽는 테이블을 선행 태이블이라 하고, 뒤에 오는 테이블을 후행 테이블이라고 한다
  • 선행 테이블은 조회할 데이터가 적은 테이블로 선택하는 것이 속도면에서 유리

 

= 테이블의 조인은 조인대상이 되는 테이블의 이름을 FROM절에 나열하기만 하면된다

= 별도의 조건이 없으면 테이블1의 모든 행과 테이블2의 모든 행이 연결된 가상의 테이블이 생성된다 ( 카디션 곱 )

 

 

 

Join의 종류

 

카디션곱(Cartesian product)

 

  • 조인에서 가장 중요한 부분은 조인조건을 지정해주는 부분이다
  • emp테이블과 dept테이블에서 서로 관련있는 데이터를 가져올 때, 조인조건을 보고 가져오게 되는데 조인조건이 적절하지 않으면 틀린 데이터를 가져오거나 데이터를 가지고 오지 못할 수 있다
  • 카티션곱은 조인조건을 지정하지 않고, 두 개 이상의 테이블을 조인하는 것이다
  • 조인조건을 지정하지 않으면 조인된 테이블의 모든 데이터를 전부 가져오게 된다
  • ANSI SQL에서는  CROSS Join이라고 한다
  • 이런 경우 조인 작업에 참조되는 테이블의 행수를 모두 곱한 값 만큼의 행이 조회결과가 된다 ( M * N )

 

 

카디션곱 예시

(좌)REGIONS 테이블의 값 / (우) COUNTRIES 테이블의 값

 

 

REGIONS 테이블의 값 : 4 / COUNTRIES 테이블의 값 : 25 가 곱해져서 출력값이 100이 나오는 것을 알 수 있다

 

 

 

 

등가조인(Equi Join)

 

  • 조인에서 가장 많이 사용되는 조인
  • 등가조인은 선행 테이블에서 데이터를 가져온 후 조인 조건절을 검사해서 동일한 값을 가진 데이터를 후행 테이블에서 꺼내오는 방법이다
  • 조인조건에서 Equal(=) 연산자를 사용해서 Equi Join이라고 한다

 

등가조인 방법

-- ORACLE 등가조인
        SELECT A.컬럼명, A.컬럼명, B.컬럼명, B.컬럼명, ...
        FROM 테이블 A, 테이블 B
        WHERE A.컬럼명 = B.컬럼명;

 

 

 -- ANSI SQL 등가조인
        SELECT  A.컬럼명, A.컬럼명, B.컬럼명, B.컬럼명, ...
        FROM 테이블 A JOIN 테이블 B
        ON A.컬럼명 = B.컬럼명;

 

 

 

 

등가조인 사용예시

 

(좌) ORACLE에서의 등가조인과 (우) ANSI SQL에서의 등가조인 방식이다

 

 

 

ORACLE 방식, ANSI SQL방식으로 각각 적어보았다. 결고값은 참고로 두개 다 동일하다

 

 

 

 

테이블 3개를 등가조인하는 예시

테이블을 3개 조인하는 것도 가능하다

 

 

 

비등가조인(Non-Equi Join)

 

  • 조인조건을 지정할 때 조인 대상테이블에서 같은 값을 가진데이터를 가져오는 대신, 크거나 작은 경우의 조건으로 데이터를 조회하는 조인 방식이 비등가 조인이다.

 

비등가조인 예시

 

 

 

 

 

포괄조인(Outer Join)

 

  • 등가조인, 비등가조인은 조회하려는 데이터들이 조인에 참여하는 모든 테이블에 데이터가 존재하는 경우에만 조회된다
  • 포괄조인은 한쪽 테이블에는 데이터가 있고, 다른쪽 테이블에는 데이터가 없는 경우에 데이터가 있는 쪽 테이블의 내용을 전부 조회하는 조인방법이다

 

포괄조인 예시

Null 값을 갖고있는 Manager_Id와 First_name이 있기 때문에 E.Employee에 (+)를 주었다

 

 

 

ANSI SQL에서는 LEFT OUTER JOIN 이라는 명령어 또는 RIGHT OUTER JOIN 명령어를 사용해서 한다

 

 

 

 

셀프조인(Self Join)

 

  • 하나의 테이블을 이용해서 조인을 구성하는 것이다
  • 하나의 테이블 안에 상위데이터, 하위데이터가 있는 경우 상위데이터와 하위데이터를 서로 연관지어서 조회할 때 셀프조인이 필요하다
  • 하나의 테이블을 역할을 각각 나누어서 조인에 참여시켜야 한다

 

셀프조인 예시