[DB] 데이터베이스 조인 개념과 실행 절차

Loopy·2022년 2월 17일
0

데이터베이스

목록 보기
3/11
post-thumbnail

1️⃣조인이란?

조인이란, 두 개 이상의 테이블 들을 연결 또는 결합하여 데이터를 출력하는 것을 말한다.

일반적으로, Primary Key나 Foregin Key 값의 연관에 의해 조인이 성립된다. 만약, 관계가 없더라도 기타 다른 칼럼간 논리적인 연관만으로도 조인이 가능하다.

다만, 주의할 점은 FROM 절에 여러 테이블이 나열되더라도 SQL 에서 데이터를 처리할 때는 단 두 개의 집합 간에만 조인이 일어난다는 것이다.

예를 들어, FROM 절에 A, B, C, D테이블이 나열되었더라도 특정 2 개의 테이블만 먼저 조인 처리되고, 조인으로 생성된 새로운 데이터 집합 + 남은 한 개의 테이블이 다음 차례로 조인되는 것이다. 옵티마이저는 ( ( (A JOIN D) JOIN C) JOIN B)와 같이 순차적으로 조인을 처리하게 된다.

2️⃣ CARTESIAN PRODUCT

WHERE절 없는, 즉 조인 조건이 없는 조인을 말한다.

만약 아래처럼 table1의 데이터가 3개, table2의 데이터가 4개라고 할때 둘을 CARTESIAN PRODUCT하게 되면 둘을 곱한 만큼의 데이터(4X3)인 12개가 조인의 결과로 나오게 된다. 즉, 각 테이블의 데이터는 상태 테이블의 ROW 수만큼 출력되게 되는 것이다.

  SELECT b.col, a.col
     FROM tab2 b, tab1 a:

✅ CARTESIAN PRODUCT 활용

그렇다면, CARTESIAN PRODUCT는 언제 사용할까?
바로 ROLLUP, CUBE, GROUPING SETS로 구현해야하는 것을 이 CARTESIAN PRODCUCT를 사용해 구현할 수 있다. 아래 예시를 자세히 살펴보자.

SELECT deptno,job,SUM(sal) as total
FROM emp
WHERE deptno IN (10,20)
GROUP BY GROUPING SETS (deptno, job)
ORDER BY 1,2;

1) 인덱스 사용을 통해 테이블로 데이터를 읽어서 TEMP 테이블화해서 데이터를 로드하는 작업

2) TEMP 테이블로부터 데이터를 읽어 부서별로 GROUP BY 하고 TEMP TABLE로 로드하는 작업

3) TEMP 테이블로부터 읽어서 직종별로 GROUP BY하고 다시 TEMP TABLE로 로드하는 작업

4) TEMP 테이블에서 데이터를 모두 읽어 VIEW로 활성한 후 SORTING 변환 과정을 거쳐 최종적으로 SELECT 하는 작업

이렇게 4가지 단계로 이루어지는 것을 볼 수 있다.

😣하지만 작업량이 많을 뿐더러 보통 TEMP TABLE로의 변환은, 배치 작업에서 하는 경우가 좋은데 real-time으로 온라인 상에서 데이터를 조회하는 경우는 이 작업조차 성능상 문제를 일으키케 된다.

이렇게 작업량이 많은 문제를, 카티션 프로덕트를 사용함으로써 해결 가능해진다. 아래는 카티션 프로덕트를 사용한 예시이다.

카티션 프로덕트를 수행하면 머지 조인이 일어나게 된다. 머지 조인은 왼쪽과 오른쪽 작업이 동시에 진행되는 작업인데, 즉 두 건의 데이터를 같게 하는 부분과, 테이블에서 데이터를 읽어 그룹핑 하는 작업이 동시에 진행 되는 것이다. 따라서 성능을 향상시킬 수 있다.

3️⃣ EQUL JOIN

등가 조인이란, where절에 조인을 위한 조건을 "=" 연산자를 사용하여 수행하는 것을 말한다.

조인의 가장 기본을 교집합을 만드는 것이기 때문에, 두 테이블 간 일치하는 것을 조인한다. 참고로 HASH 조인은 EQUI 조인에서만 사용 가능하다.

SELECT e.empno, e.ename, d.dname
FROM dept d, emp e
WHERE d.deptno = e.deptno
	AND e.job = 'MANAGER'
ORDER BY d.deptno;

where 절에 다른 추가 조건이 들어가는 것도 가능하다.

4️⃣ NON-EQUAL JOIN

"="가 아닌 연산자로 조인을 맺는 것을 말한다.

SELECT e.ename, e.job, e.sal, s.grade, s.losal, s.hisal
FROM salagrades, emp e
WHERE e.sal >= s.losal
	AND e.sal <= s.hisal

아래의 SQL문은, 세 사람의 데이터에서 사원명이 S로 시작하거나 T를 포함한 데이터를 찾고자 조인을 맺고 있다. dummy 테이블에는 S%와 %T% 두가지 데이터를 가지고 있으며 아래 SQL문의 결과는 총 4건이 된다.(S로 시작되는 사원이 2명, T포함한 사원이 2명)

WITH dummy AS      #dummy 임시 테이블 생성(뷰)
(SELECT 'S%' AS ename FROM dual
 UNION ALL
 SELECT '%T%' FROM dual)
SELECT e.ename
	FROM emp e, dummy f
    WHERE e.name LIKE f.ename
    AND e.ename in ('ALLEN', 'SCOTT', 'SMITH');

🔖WITH 구문
서브쿼리를 사용해 임시 테이블이나 뷰처럼 사용할 수 있으며, 서브쿼리 블록에 별칭을 지정할 수도 있다.

WITH 임시테이블명 AS (SELECT 칼럼명 FROM 테이블명)
 SELECT * FROM 임시테이블명

5️⃣ OUTER JOIN

Outer join이란, 두 테이블 간 교집합(EQUI join)을 조회하고 한 쪽 테이블에만 있는 데이터도 포함시켜서 조회하는 방법을 말한다.

이 때, 왼쪽 테이블에만 있는 행도 포함하면 Left Outer join, 오른쪽 테이블의 행만 포함시키면 Right Outer join이라고 한다. FULL Outer joinLeft Outer join과 Right Outer join을 모두 사용하는 것으로 Oracle DB에서는 "(+)" 기호를 사용해서 할 수 있다.

예시를 살펴보자. 지금은 ANSI 표준 조인을 사용하는 경우가 아니므로, 참조하려는 테이블에는 모두 (+) 기호를 붙여줘야한다.

table1이 주 테이블, table2는 참조 테이블이다. 이때, table1의 데이터는 다 나타나야 하고 table2에 대해서는 조인이 되는 것만 나타나고 나머지는 null값이 나타나야 하면 다음과 같이 작성해준다.

SELECT tq.pattern, t1.id, t2.id, t2.pattern
FROM t1, t2
WHERE t1.pattern = t2.pattern(+);

참고자료.
https://www.youtube.com/c/전광철OCP

profile
개인용으로 공부하는 공간입니다. 잘못된 부분은 피드백 부탁드립니다!

0개의 댓글