CS - 강의, 서적/[SQLD] 홍쌤의 데이터랩

[SQLD] 2-7~8. 조인 (USING/ON, Oracle/ANSI 표준별 조인)

SH3542 2024. 9. 16. 21:07

[홍쌤의 데이터랩, SQLD n과목 완벽 정리] 영상를 개인이 정리하여 [원작자의 허가 이후] 올린 글이며,

[개인이 추가로 정리한 내용]이 포함되어 있습니다.

 

 

 
 

홍쌤의 데이터랩

[개정판] SQLD n과목 완벽 정리

https://www.youtube.com/watch?v=rdfHFnqVoRw

 

 


 

 

목차

 

    조인 (JOIN)

    - 여러 테이블의 데이터를 사용하여 동시 출력하거나 참조할 경우 사용

    - FROM절에 조인 테이블 나열

    - ORACLE 표준과 ANSI 표준은 특히 JOIN에서 다소 상이

    - 동일한 열이 여러 테이블에 존재할 경우, 열 이름 앞에 별칭이나 테이블 이름 표시

    - N개의 테이블을 조인하려면 N-1개 이상의 조인 조건 필요

     

    ON/USING절

    조인 조건을 명시하는 절

    ON절 

    - 조인할 양 컬럼의 컬럼명이 다르더라도 사용 가능 (+ 타입이 다르면 자동형변환)

    - EQUI JOIN, NON-EQUI JOIN 수행 시 모두 사용 가능

    - ON 조건의 괄호는 생략 가능

    - 컬럼명이 같을 경우, 테이블 이름이나 별칭을 사용하여 구분

    - ON 조건절에서 조인 조건 명시, WHERE절에는 일반 조건 명시 권장

     

    USING절 

    - 조인할 컬럼명이 같은 경우 사용

    - 대상 컬럼을 기준으로 EQUI JOIN 실행

    => ON절을 이용해 EQUI JOIN을 수행할 시, 문법 및 가독성에 용이하여 사용

    - 괄호 필수

    e.g.

     

    1) ON -> USING 변경

    SELECT ...
    FROM A a
    INNER JOIN B b
    --- ON a.id = b.id;

    USING (id); --- 괄호 필수, 위와 같은 동작

     

    조인의 분류

    1. 조건의 형태에 따라

    1. EQUI JOIN(등가 JOIN)

    조인 조건이 동등 조건인 경우

     

    2. NON-EQUI JOIN

    조건이 동등 조건이 아닌 경우

     

    2. 조인 결과에 따라

    1. INNER JOIN

    조인 조건에 성립하는 데이터만 출력하는 경우

     

    2. OUTER JOIN

    조인 조건에 성립하지 않는 데이터도 출력하는 경우

    => 기준이 되는 테이블에 따라 (LEFT/RIGHT/FULL) OUTER JOIN으로 나뉨

     

    3. NATURAL JOIN

    조인 조건 생략시 두 테이블에 같은 이름으로 자연 연결되는 조인

     

    4. CROSS JOIN

    조인 조건 생략시 두 테이블의 발생 가능한 모든 행을 출력하는 조인 (카타시안 곱 주의)

     

    5. SELF JOIN

    하나의 테이블을 두 번 이상 참조하여 연결하는 조인

     

    표준 조인

    ANSI 표준으로 작성되는 INNER JOIN, CROSS JOIN, NATURAL JOIN, OUTER JOIN(Oracle은 키워드 대신 (+)로 사용 가능)을 말함

     

    조건의 형태에 따른 조인의 종류

    1. EQUI JOIN - 조인 조건이 동등한 경우

    - 조인 조건의 =(equal) 비교를 통해 같은 값을 가지는 행을 연결하여 결과를 얻는 방법

    - SQL 명령문에서 가장 많이 사용

    - FROM절에 조인하고자 하는 테이블 모두 명시

    - WHERE절에 두 테이블의 공통 컬럼에 대한 조인 조건(동등 비교) 조건을 나열

    - NULL 값 끼리의 동등 비교는 수행하지 않음

     

    2. NON-EQUI JOIN - 조인 조건이 동등하지 않은 경우 

    - 조인 조건의 비교 연산자가 =가 아닌 조인

    e.g. >, <=, BETWEEN

     

    결과의 형태에 따른 조인의 종류 (in Oracle/ANSI 표준)

    1. INNER JOIN - 조인 조건에 성립하는 데이터를 다룰 때

    - 조인 조건이 일치하는 행만 추출 (Oracle default 조인)

    - ANSI 표준의 경우 FROM절에 INNER JOIN 혹은 JOIN 명시 (같은 의미)

    - ANSI 표준의 경우 USING 이나 ON 조건절을 필수적으로 사용

    - Oracle의 경우 WHERE절 사용 (JOIN 키워드 x)

     

    e.g.

    1) ANSI 표준

    SELECT ...
    FROM A a
    [INNER] JOIN B b ON a.id = b.id;

     

    2) Oracle 표준

    SELECT ...
    FROM A a, B b
    WHERE a.id = b.id;

     

    2. OUTER JOIN - 조인 조건에 성립하지 않는 데이터도 다룰 때

    출처 : https://hongong.hanbit.co.kr/sql-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95-joininner-outer-cross-self-join/

     

    - 기준이 되는 테이블에 따라 (LEFT/RIGHT/FULL) OUTER JOIN으로 나뉨

    - 조인 조건에서 동일한 값이 없는 행도 반환할 때 사용

    => 두 테이블 중 한쪽이 NULL을 가져, INNER JOIN시 출력되지 않을 때 사용

    - OUTER 생략 가능 (LEFT OUTER JOIN -> LEFT JOIN)

    - Oracle 표준에서는 OUTER JOIN 키워드가 존재하지 않으므로, 기준 테이블의 반대(+)를 붙여 사용 가능

     

    2-1. LEFT OUTER JOIN

    - FROM절의 왼쪽 테이블의 데이터를 읽은 후, 오른쪽 테이블에서 JOIN 대상을 읽어옴

    - 우측 값에서 같은 값이 없는 경우 NULL 출력

     

    활용 예제

    학생(left)/교수(right) 엔터티가 있을 때,

    학생의 지도교수 테이블 출력(join)시, 지도교수를 담당받지 않은 학생까지 포함(left outer join)

     

    e.g.

    1) ANSI 표준

    SELECT ...

    FROM A a LEFT [OUTER] JOIN B b

    ON a.id = b.id

    WHERE ...;

     

    2) Oracle 표준

    SELECT ...

    FROM A a, B b

    WHERE a.id = b.id(+) --- LEFT가 기준 테이블 이므로, RIGHT에 (+) 표시

    AND ...;

     

    2-2. RIGHT OUTER JOIN

    - LEFT OUTER JOIN의 반대

    - 테이블 순서를 변경하여 LEFT OUTER JOIN으로 수행 가능

     

    2-3. FULL OUTER JOIN

    - 두 테이블 전체 기준으로 결과를 생성하여, 중복 데이터는 삭제 후 리턴

     

    e.g.

    1) ANSI 표준

    SELECT ..

    FROM A a FULL [OUTER] JOIN B b

    ON a.id = b.id

     

    2) ORACLE 표준 - UNOIN 활용

    SELECT ..

    FROM A a, B b

    WHERE a.id = b.id(+)

    UNION

    SELECT ..

    FROM A a, B b

    WHERE a.id(+) = b.id

     

    3. NATURAL JOIN - 공통 컬럼들이 모두 일치하는 데이터를 다룰 때

    - 두 테이블의 동일한 이름과 타입을 가지는 모든 컬럼들에 대해 EQUI JOIN을 수행

    - 일치하는 모든 컬럼이 같은 행만 반환

    - USING, ON, WHERE 절에서 조건 정의 불가능

    - Oracle/ANSI 표준 동일

     

    e.g.

    1) Oracle/ANSI 표준

    SELECT ...

    FROM A

    NATURAL JOIN B;

     

    4. CROSS JOIN - 데이터의 모든 조합을 다룰 때

    - 테이블 간 JOIN 조건이 없는 경우, 생성 가능한 모든 조합 출력 (m*n개의 카타시안 곱 출력)

    - Oracle/ANSI 표준 동일

     

    e.g.

    1) Oracle/ANSI 표준

    SELECT ...

    FROM A

    CROSS JOIN B;

     

    5. SELF JOIN - 자기 자신을 참조할 때

    - 한 테이블 내 각 행끼리 관계를 갖는 경우의 조인 기법

    - 테이블명이 반드시 중복(자기 자신 참조)되므로, 구분을 위해 별칭 사용 필수

    - 조인 대상 테이블이 자기 자신으로 바뀐 것 뿐이므로, 다른 조인과 혼재하여 사용 가능
    - Oracle/ANSI 표준 동일