본문 바로가기
IT Programming/Oracle

[Oracle] 쿼리의 조인 VOL.2) NATURAL JOIN , CROSS/SELF JOIN

by Euniieunii 2023. 4. 19.

크로스 조인(Cross Join)과 셀프 조인(Self Join)은 데이터베이스에서 두 개 이상의 테이블을 사용하여 데이터를 결합하는 데 사용되는 방법이다.

[ 크로스 조인(Cross Join) ]

: 두개 이상의 테이블에서 모든 가능한 조합을 만드는 것.
-> 조인 시 조인 조건을 명시하지 않으면 CROSS JOIN 상태가 된다. : 잘못된 조인!

<크로스 조인(Cross Join) 사진 출처 : 혼공 hongong.hanbit.co.kr >

예를 들어, "고객 테이블" 과 "주문 테이블"이 있다고 가정하였을 때 CROSS JOIN을 사용하여 "고객 테이블"의 각 행과 "주문 테이블"의

각 행을 결합할 수 있다.어떠한 모든 가능한 조합을 만들 수 있기 때문이다.

하지만  CROSS JOIN의 경우, 일반적으로 과도하게 많은 행을 생성할 수 있기 때문에 사용전에는 신중히, 주의해야 할 필요가 있다.

 

--CrossJoin
--조인조건을 명시하지 않으면 의미없는 데이터가 조회된다.
SELECT A.ENO
     , A.ENAME
     , A.DNO
     , B.DNAME
    FROM EMP A
       , DEPT B;

 

[ 셀프 조인 (SELF JOIN) ]

: 하나의 테이블에서 자신과 결합하는 것
-> FROM절과 테이블이 조인되는 테이블이 같을 경우 셀프 조인이라고 하며, 조인되는 테이블에
무조건 별칭을 정해줘야만 한다!

<셀프 조인(SELF Join) 사진 출처 : 혼공 hongong.hanbit.co.kr >

 

셀프 조인(Self Join)을 사용하면, 하나의 테이블에서 두 개 이상의 열을 연결하여 새로운 결과를 생성할 수 있다.

예를 들어, "직원 테이블"에서 상사 ID와 직원 ID를 연결하여 직원의 상사 이름을 가져올 수 있다. 이를 위해, 직원 테이블을 두 번 사용하여 상사와 직원을 각각 다른 열에 매핑하고, 그들의 이름을 결합할 수 있는 것이다.

 

--셀프조인
--FROM절의 테이블과 조인되는 테이블이 같을 때
--사원의 사수의 이름 조회
SELECT A.ENO
     , A.ENAME
     , A.MGR
     , B.ENO
     , B.ENAME
    FROM EMP A
    JOIN EMP B
    ON A.MGR = B.ENO;

크로스 조인(Cross Join)과 셀프 조인(Self Join)은 각각의 고유한 상황에서 사용되며, 두 조인 모두 데이터베이스에서 유용하게 사용될 수 있다. 이는 데이터베이스 설계 및 쿼리 작성 시에 고려해야 할 중요한 고려사항이다.


[ 내츄럴 조인 (NATURAL JOIN) ]

: 두 개 이상의 테이블에서 공통적으로 가지고 있는 열(column)을 기준으로 조인하는 방법
-> NATURAL JOIN은 두 테이블의 동일한 이름을 가지는 칼럼이 모두 조인된다.

 

내츄럴 조인은 일반적으로 내부조인(Inner Join)의 일종으로 분류되며 등가조인의 한 종류이다. 

- 등가 조인: 조인 조건에서 공통된 컬럼의 값이 같은(=) 조건에 해당하는 조인
- 비등가 조인: 조인 조건에서 값의 의미가 동일한 데이터들의 대소 비교를 해주는 형식의 조인(>, <, <=, >=)

공통 열을 기준으로 두 테이블을 조인한다. 내츄럴 조인은 공통 열을 자동으로 인식하여 조인하기 때문에 간편하고 빠르게 조인이 가능하다.

--NATURAL JOIN에서는 조인되는 컬럼에 테이블의 별칭을 달아서 사용할 수 없다.
SELECT SNO
     , st.SNAME
     , AVG(sc.RESULT)
    FROM SCORE sc
    NATURAL JOIN STUDENT st
    GROUP BY SNO, SNAME;
    
--학생별 기말고사 성적의 평균이 55점이상인 학생번호, 학생이름, 기말고사 평균 조회(NATURAL JOIN)
SELECT SNO
     , st.SNAME
     , AVG(sc.RESULT)
    FROM SCORE sc
    NATURAL JOIN STUDENT st
    GROUP BY SNO, SNAME
    HAVING AVG(sc.RESULT) >= 55;

여기서 주의할 점공통된 열의 이름이 다르거나 데이터 타입이 다른 경우에는 조인이 제대로 이루어지지 않을 수 있다. 반드시 조인하려는 열의 이름을 변경 또는 데이터 타입을 일치시켜야 한다.

또한, 일반적으로 다른 조인 방법 보다 느릴 수 있다. 이는 공통 열의 크기가 크거나 조인에 사용되는 인덱스가 부족한 경우 더욱이 느려질 수 있기 때문에 대규모 데이터베이스에서는 성능문제를 고려하면서 사용할 필요가 있다.

 


 

 

 

댓글