ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 조인
    데이터베이스 2021. 5. 8. 17:38

    조인은 두 개 이상의 테이블을 연결해 데이터를 출력하는 것으로, 관계형 데이터베이스의 가장 큰 장점이면서 핵심기능이다. 일반적인 경우 PK,FK 연관관계에 의해 조인이 성립되지만, 이런 관계가 없어도 논리적인 값들의 연관으로 조인이 성립될 수도 있다.


    WHERE 절의 조인 

     

    EQUI JOIN

    등가 조인은 두 개의 테이블 간에 컬럼 값들이 서로 정확하게 일치하는 경우에 사용되는 방법으로 대부분 PK-FK 관계를 기반으로 하지만 반드시 그런 것은 아니다. 이 기능은 계층형이나 망형 데이터베이스와 비교할 때 관계형 데이터베이스의 큰 장점이다.

    JOIN 조건은 WHERE 절에 기술하는데 "=" 연산자를 사용해 표현한다.

    SELECT 테이블1.컬럼 , 테이블2.컬럼 FROM 테이블1, 테이블2
    WHERE 테이블2.컬럼 = 테이블1.컬럼;

    ANSI/ISO SQL 표준 방식 (아래 FROM 절 조인에 다시 설명)

    SELECT 테이블1.컬럼, 테이블2.컬럼 
    	FROM 테이블 1 
        	INNER JOIN 테이블2 
        ON 테이블2.컬럼=테이블1.컬럼;

     

    조인조건에 맞는 데이터만 출력하는 INNER JOIN 에 참여하는 대상 테이블이 N 개일 때, 

    필요한 조인 조건은 N-1 개 이상이다. 

    즉, FROM 절에 테이블 3개가 필요하다면, 조인 조건은 2개 이상 필요하다.


    NON EQUI JOIN

    비등가 조인은 두 개의 테이블 간에 논리적인 연관관계를 갖고 있으나, 컬럼 값들이 서로 일치하지 않는 경우에 사용된다.

    비등가 조인은 "=" 가 아니라 (BETWEEN, >,>=,<,<=) 등 연산자를 사용해 조인을 수행한다.

    SELECT 테이블1.컬럼, 테이블2.컬럼 
    	FROM 테이블1, 테이블2
     	WHERE 테이블1.컬럼 BETWEEN 테이블2.컬럼1 AND 테이블2.컬럼2;

    3개 이상 TABLE JOIN 하기

     

    선수명, 포지션, 소속팀명, 연고지, 구장명의 데이터를 얻기 위한 쿼리이다.

    SELECT
        A.NAME AS 선수명
        ,A.POSITION AS 포지션
        ,B.REGION_NAME AS 연고지
        ,B.TEAM_NAME AS 팀명
        ,C.STADIUM_NAME AS 구장명
    FROM PLAYER A, TEAM B, STADIUM C
    WHERE B.TEAM_ID = A.TEAM_ID
    	AND B.STADIUM_ID = C.STADIUM_ID
    ORDER BY 선수명;    

    OUTER JOIN 

    등가 조인, 비등가조인은 모두 조인 조건이 참인 행들만 반환하는 INNER 조인이다.

    OUTER 조인은 조인 조건을 만족하지 않는 행들도 함께 반환할 때 사용한다.

    OUTER 조인을 사용하기 위해 "+" 기호를 사용하는데, 기준이 되는 테이블은 "+" 의 맞은편에 있는 테이블이다.

    아래 같은 경우 STADIUM 이 기준이 되는 테이블이며, 아래 데이터가 출력될때 TEAM 에 관련된 데이터가 NULL 이여도 

    STADIUM 에 있는 데이터라면 함께 출력이 된다.

    SELECT 
        A.STADIUM_NAME
        , A.STADIUM_ID
        , B.TEAM_NAME
    FROM STADIUM A, TEAM B
    WHERE B.TEAM_ID(+) = A.HOMETEAM_ID;

    FROM 절의 조인 

    여기까지 쓰인 설명과 예시에서 조인문은 WHERE 절에 사용되었다.

    ANSI/ISO SQL 에서 표시하는 FROM 절의 조인 형태는 아래와 같다.

     

    1. INNER JOIN

    2. NATURAL JOIN

    3. USING 조건절

    4. ON 조건절

    5. CROSS JOIN

    6. OUTER JOIN

     

    전통적인 JOIN 문의 문법에서는 WHERE 절에 조인 조건과 데이터 제한 조건이 같이 사용돼 용도가 불분명한 경우가 발생할 수 있는 반면, ON 조건절을 이용해 조인조건과 데이터 제한조건을 분리하는 것은 ANSI/ISO SQL 방식의 특징이다.


    INNER JOIN

     

    전통적 방식

    SELECT 테이블1.컬럼 , 테이블2.컬럼 
    FROM 테이블1, 테이블2
    WHERE 테이블2.컬럼 = 테이블1.컬럼;

    ANSI/ISO SQL 표준 방식 

    SELECT 테이블1.컬럼, 테이블2.컬럼 
    	FROM 테이블 1 
        	INNER JOIN 테이블2  //INNER 는 JOIN 의 DEFAULT 라 생략가능
        ON 테이블2.컬럼=테이블1.컬럼;

    NATURAL JOIN 

    INNER JOIN 의 하위개념으로 볼 수 있으며, 두 테이블 간에 동일한 이름을 갖는 모든 컬럼들에 대해 등가 조인을 수행한다. 

    NATURAL JOIN 이 명시되면 추가로 USING,ON,WHERE 절에서 조인 조건을 정의할 수 없다.

    SELECT A.EMPNO, A.ENAME, B.DNAME 
    FROM EMP A 
    NATURAL JOIN DEPT B;

    별도의 조인 컬럼을 지정하지 않았지만, 두 테이블에 공통으로 존재하는 DEPTNO 라는 컬럼을 자동으로 인식해 조인을 처리한 것이다. 조인에 사용된 컬럼들은 동일한 데이터 유형이어야하고,

    ALIAS나 테이블명과 같은 접두사를 붙이면 안된다! 

    예) B.DEPTNO 혹은 DEPTNO AS DNO


    USING 조건절 

    NATURAL JOIN 에서는 같은 이름을 가진 모든 컬럼들에 대해 조인이 이뤄지지만, 

    FROM 절의 USING 조건을 이용하면 그 중 원하는 컬럼만 선택해 등가 조인을 실행할 수 있다.

    이 기능은 SQL SERVER 에서는 지원하지 않는다.

    SELECT * 
        FROM DEPT A
        JOIN DEPT_TEMP B
        USING (DEPTNO);

    USING 조건절에 사용된 컬럼에 ALIAS 나 접두사를 사용하면 에러가 난다.


    ON 조건절 

    ON 은  컬럼들에 대해 ALIAS 나 접두사를 명확하게 지정해야한다. 

    ON 조인 서술부와 WHERE 비조인 서술부를 분리해 이해가 쉽고, 컬럼명이 다르더라도 조인 조건을 사용할 수 있다.

    SELECT A.EMPNO,B.DEPTNO
    FROM EMP A JOIN DEPT B
    ON B.DEPTNO = A.DEPTNO
    WHERE B.DEPTNO = 30;

    CROSS JOIN

    PRODUCT 의 개념으로 테이블 간 조인 조건이 없는 경우 생길 수 있는 모든 데이터의 조합이다.

    양쪽 집합의 M*N 건의 데이터 조합이 발생한다. 사용할 일이 거의 없다.


    OUTER JOIN

    기존의 "+" 기호 표시 방식은 WHERE 절의 검색 조건과 구분이 불명확하고, IN이나 OR 사용시 에러, "+" 표시 누락시 INNER JOIN 으로 진행되는 등 불편한 점들이 많았다.

     

    -LEFT OUTER JOIN

    왼쪽에 쓰인 테이블이 기준이 된다.

    SELECT A.STADIUM_NAME, B.TEAM_NAME
    	FROM STADIUM A LEFT OUTER JOIN TEAM B //OUTER 는 생략 가능 키워드
        ON B.TEAM_ID=A.HOMETEAM_ID
        ORDER BY A.HOMETEAM_ID;

    -RIGHT OUTER JOIN

    오른쪽에 쓰인 테이블 기준이다.

     

    -FULL OUTER JOIN

    좌,우 테이블의 모든 데이터를 읽어 조인해 결과를 생성한다.

    RIGHT OUTER JOIN 과 LEFT OUTER JOIN 의 결과를 합집합으로 처리한 결과와 동일하다.

    단 조인에 성공한 행들은 한번만 표시한다.

     

     


    출처

    SQL 전문가 가이드 - 한국데이터산업진흥원

    반응형

    '데이터베이스' 카테고리의 다른 글

    집합연산자  (0) 2021.05.11
    서브쿼리  (0) 2021.05.08
    단일함수, 집계함수  (0) 2021.05.05
    정규화  (0) 2021.05.03
    식별자  (0) 2021.05.02
Designed by Tistory.