[SQL] 조인 ( Join )

728x90

 

  조인  ( Join )

 

  -  두 개 이상의 테이블 들을 연결 또는 결합하여 데이터를 출력하는 것

  -  관계형 데이터베이스의 가장 큰 장점이면서 대표적 핵심 기능

  -  일반적인 경우 PK( Primary Key )나 FK( Foreign Key ) 값의 연관에 의해 성립
     논리적인 값들의 연관만으로도 성립 가능

  -  데이터 처리 시 두 개의 집합씩 수행됨  ( 테이블 여러 개 조인 시에도 )
    ( ex)  FROM A, B, C, D  ☞  ( ( ( A JOIN B ) JOIN C ) JOIN D ) )
    ( 조인 순서는 옵티마이저에 의해 결정됨 )

  -  정규화는 데이터 정합성과 데이터 저장 공간의 절약을 위해 Entity를 최대한 분리하는 작업

 

   ■  EQUI JOIN  ( 등가 조인 )

     -  두 개의 테이블 간 칼럼 값들이 서로 정확하게 일치하는 경우에 사용

     -  대부분 PK ↔ FK의 관계를 기반 으로 함

     -  JOIN 조건은 WHERE 절에 '=' 연산자를 사용해서 표현

     -  특정 칼럼에 접근 시 어느 테이블의 칼럼인지 명시해야 함
      ( 각각 다른 테이블에 동명의 칼럼이 존재할 수 있고, 가독성이나 유지보수성을 높이기 위해 )

     -  N 개의 테이블로부터 필요한 데이터를 조회하기 위해 필요한 JOIN 조건은 N - 1 개 이상

     -  테이블에 대해 ALIAS 사용 가능  ( 테이블명이 길고 SQL 의 복잡도가 높아지면 주로 사용 )
      ( FROM 절에서 테이블에 대한 ALIAS 사용 후에는 WHERE 절과 SELECT 절에는 테이블명이 아닌 ALIAS를 써야 함 ) 

 

   ■  Non EQUI JOIN  ( 비등가 조인 )

     -  두 테이블 간에 칼럼 값이 서로 정확하게 일치하지 않는 경우에 사용  ( 데이터 모델에 따라 불가능한 경우도 있음 )

     -  WHERE 절에 ‘=’ 연산자가 아닌 다른 연산자( >, >=, <, <=, Between 등 )들을 사용

 

  표준 조인  ( Standard Join )

  -  ANSI/ISO 표준 SQL 기능 중 하나

 

  <  집합 연산자  >

   -  조인을 사용하지 않고 연관된 데이터를 조회할 수 있음
   -  조인은 데이터 집합을 수직으로 연결 하고, 집합 연산자는 데이터 집합을 수평으로 연결
   -  집합 연산자는 주로 서브 타입이나 수평 분할된 테이블을 연결하는 용도로 사용
   -  집합 연산자는 여러 개의 질의의 결과를 연결하여 하나로 결합하는 방식
     ( 2개 이상의 질의 결과를 하나의 결과로 만들어 줌 )
   -  SELECT 절의 칼럼 수가 동일 하고, 동일 위치에 존재하는 칼럼의 데이터 타입이
      상호 호환( 반드시 같은 데이터 타입일 필요는 없음 ) 가능해야 함

     ■  UNION ( 합집합 ) 

      -  UNION  --  공통 교집합의 중복을 없애기 위해 정렬 작업 발생 -> 시스템 부하
      -  UNION ALL  --  정렬 하지 않고 공통 집합을 중복해서 그대로 보여줌

더보기
SELECT ...
UNION [ALL | DISTINCT] 
SELECT ...
[ UNION [ALL | DISTINCT] 
  SELECT ... ]

     ■  INTERSECTION ( 교집합 )

      -  INTERSECT  --  두 집합의 공통 집합 추출  ( Oracle DB )

     ■  DIFFERENCE ( 차집합 )

      -  MINUS  or  EXCEPT  --  집합 A 에서 집합 B 와의 공통 집합을 제외한 부분  ( Oracle DB )

     ■  PRODUCT ( 곱집합 )

      -  CROSS JOIN  --  JOIN 조건이 없는 경우 생길 수 있는 모든 데이터의 조합  ( 양쪽 집합의 M * N 건의 데이터 조합 발생 )

 

  <  관계 연산자  >

     ■  SELECT  연산  ( 행 선택 )  --  WHERE 절

     ■  PROJECT  연산  ( 열 선택 )  --  SELECT 절

     ■  (NATURAL) JOIN  연산  --  다양한 JOIN 기능

     ■  DIVIDE  연산  --  (X)

 

  <  JOIN 형태  >  --  FROM 절에 사용

  • [INNER]  JOIN
    • NATURAL  JOIN
  • LEFT / RIGHT / FULL  [OUTER]  JOIN
  • CROSS  JOIN
  • SELF  JOIN

     ■  INNER JOIN

      -  WHERE 절에서부터 사용하던 JOIN 의 DEFAULT 옵션
      -  JOIN 조건에서 동일한 값이 있는 행만 반환
      -  WHERE 절에서 사용하던 JOIN 조건을 FROM 절에서 정의하겠다는 표시이므로
         USING 조건절이나 ON 조건절을 필수적으로 사용해야 함
      -  CROSS JOIN , OUTER JOIN과는 같이 사용할 수 없음

     ■  NATURAL JOIN

      -  두 테이블 간의 동일한 이름을 갖는 모든 칼럼들에 대해 EQUI JOIN 수행
      -  JOIN이 되는 테이블의 데이터 타입과 칼럼명 등이 동일해야 하는 제약 조건 이 있음
      -  별도의 JOIN 칼럼을 지정하지 않아도, 2개의 테이블의 공통된 칼럼을 자동으로 인식하여 JOIN 처리
      -  추가로 USING / ON / WHERE 조건절에서 JOIN 조건을 정의할 수 없음
      -  ALIAS나 테이블명과 같은 접두사를 붙일 수 없음

     ■  OUTER JOIN

      -  JOIN 조건에서 동일한 값이 없는 행도 반환
      -  TAB1의 모든 값에 대해 TAB2의 데이터가 반드시 존재한다는 보장이 없는 경우 사용
      -  OUTER JOIN 도 역시 USING 조건절이나 ON 조건절을 필수적으로 사용해야 함
     *  LEFT OUTER JOIN  --  컬럼1  =  컬럼2 (+)  ( 오른쪽 테이블에 NULL 허용 )
     *  RIGHT OUTER JOIN  --  컬럼1 (+)  =  컬럼2  ( 왼쪽 테이블에 NULL 허용 )
     *  FULL OUTER JOIN  --  RIGHT JOIN과 LEFT JOIN의 결과를 합집합으로 처리한 결과와 동일 ( 중복 데이터 제외 )

     ■  CROSS JOIN

      -  테이블 간 JOIN 조건이 없는 경우 생길 수 있는 모든 데이터의 조합
      -  두 개의 테이블에 대한 CARTESIAN PRODUCT 또는 CROSS PRODUCT와 같은 표현으로,
         결과는 양쪽 집합의 M * N 건의 데이터 조합 발생
      -  NATURAL JOIN 과 달리, WHERE 절에 JOIN 조건 추가 가능
       ( 단 이 경우 INNER JOIN 과 같은 결과를 얻게 되므로 CROSS JOIN 을 사용하는 의미가 없어짐 )

     ■  SELF JOIN

      -  동일 테이블 사이의 조인
      -  한 테이블 내에서 두 칼럼이 연관 관계가 있을 때 사용
      -  반드시 테이블 별칭( Alias )을 사용해야 함. 칼럼에도 모두 테이블 별칭 사용

 

  <  JOIN의 조건절  >

  • USING
  • ON

     ■  USING 조건절

      -  같은 이름을 가진 칼럼들 중에서 원하는 칼럼에 대해서만 선택적으로 EQUI JOIN을 할 수 있음
      -  ‘*’ 와일드카드처럼 별도의 칼럼 순서를 지정하지 않으면
         USING 조건절의 기준이 되는 칼럼들이 다른 칼럼보다 먼저 출력됨
         이때 JOIN에 사용된 같은 이름의 칼럼을 하나로 처리
      -  NATURAL JOIN과 마찬가지로 JOIN 칼럼에 대해서는 ALIAS나 테이블 이름과 같은 접두사를 붙일 수 없음

     ■  ON 조건절

      -  임의의 JOIN 조건을 지정하거나, 이름이 다른 칼럼명을 JOIN 조건으로 사용하거나,
         JOIN 칼럼을 명시하기 위해 사용
      -  WHERE 절의 JOIN 조건과 같은 기능을 하면서도, 명시적으로 JOIN 조건을 구분할 수 있음
      -  ALIAS나 테이블명과 같은 접두사를 사용하여 SELECT에 사용되는 칼럼을 논리적으로 명확하게 지정해주어야 함

 

table_reference: {
    table_factor
  | joined_table
}

table_factor: {
    tbl_name [PARTITION (partition_names)]
        [[AS] alias] [index_hint_list]
  | [LATERAL] table_subquery [AS] alias [(col_list)]
  | ( table_references )
}

joined_table: {
    table_reference {[INNER | CROSS] JOIN | STRAIGHT_JOIN} table_factor [join_specification]
  | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_specification
  | table_reference NATURAL [INNER | {LEFT|RIGHT} [OUTER]] JOIN table_factor
}

 

 

반응형