데이터베이스/Oracle SQL

오라클 SQL과 PL/SQL ( JOIN의 이해 )

동띠기 2021. 8. 9. 21:52

JOIN

관계형 데이터베이스에서 가장 핵심적인 기능인 join에 대해서 배워보겠습니다.
JOIN에 대해서 이야기를 하기 전에 컴퓨터의 원리부터 먼저 이야기를 해야합니다.
ORACLE뿐만 아니라 모든 프로그램들이 컴퓨터에서 작동하는 것이기에 컴퓨터의 원리를 아는 것이 프로그램의 원리를 이해하는 데 큰 도움이 됩니다.
대부분의 컴퓨터는 사용자의 데이터를 디스크에 저장해놓고 필요할때 마다 메모리로 복사를 해와서 메모리에서 작업을 합니다. 그리고 작업 도중이나 끝나면 다시 디스크에 저장을 합니다.
즉 메모리는 작업을 하는 공간이고 디스크는 저장을 하는 공간입니다. ORACLE도 컴퓨터에서 동작하는 프로그램이라서 동일한 원리로 작동합니다.
평소에는 데이터들을 하드디스크에 저장해 놓고 필요할 때마다 메모리로 복사해와서 조회도 하고 변경작업도 한다는 뜻입니다.

테이블에 컬럼이 많을 경우 중복되는 데이터도 있을 수 있어서 이런 비효율적인 작업을 막기 위해서 정규화라는 방법이 등장하게 됩니다.
정규화는 하나로 되어 있는 것을 더 작은 조각으로 분리하는 기술을 말합니다. 관계형 DBMS에서 아주 중요한 기술입니다.
정규화를 수행하면 하나의 테이블이 여러 개의 테이블들로 나누어집니다. 그럴 경우, 정규화를 하기 전에는 여러개의 테이블로 나누어져서 저장되고 이때 여러 테이블에 흩어져 있는 데이터들을 조합해서 가져오는 기술이 이번에 배우는 JOIN이라는 기술입니다.


1. 카디션 곱 (Cartesian Product)
JOIN 에서 가장 중요한 부분은 조인 조건을 지정해 주는 부분입니다.
예를들어 EMP 테이블과 DEPT테이블에 가서 서로 관련 있는 데이터를 가져올 때 이 조인 조건을 보고 가져오는데 만약 조건을 잘못 주게 되면 틀린 데이터를 가져오거나 데이터를 가져오지 못하는 경우도 생길 수 있습니다.
특히 조인 조건절을 적지 않게 되면 해당 테이블에 대한 모든 데이터를 전부 가져오는 현상이 생기는데, 이를 카지션 곱이라 부릅니다.
즉 카디션 곱이랑 JOIN 쿼리 중에 WHERE절에 기술하는 JOIN조건이 잘못 기술되었거나 아예 없을 경우 발생하는 현상입니다. ANSI SQL에서는 CROSS JOIN 이라고도 부릅니다.
이런 경우는 JOIN 작업에 참조되는 테이블 행 수를 모두 곱한 값의 결과가 만들어집니다.

 

SELECT * FROM CAT_A;
SELECT * FROM CAT_B;
SELECT * FROM CAT_C;

CAT_A
CAT_B
CAT_C

SELECT A.NAME, B.NAME
FROM CAT_A A, CAT_B B
WHERE A.NO = B.NO // 이 부분이 아주 중요한 조인 조건절 입니다.

 

 

 

SELECT A.NAME, B.NAME
FROM CAT_A A, CAT_B B

위 결과를 보면 JOIN인 조건절을 WHERE에 지정하지 않아서 모든 경우의 수가 다 나옵니다.
CAT_A * CAT_B로 계산 된 즉 2*2로 계산된 4건의 데이터가 나옵니다.

 

 

SELECT A.NAME, B.NAME, C.NAME
FROM CAT_A A, CAT_B B, CAT_C C
WHERE A.NO = B.NO AND A.NO = C.NO

 

 

SELECT A.NAME, B.NAME, C.NAME
FROM CAT_A A, CAT_B B, CAT_C C
WHERE A.NO = B.NO // CAT_C 조건이 빠져있습니다.

 

위와 같이 CAT_C 조건의 데이터가 이상하게 출력되어 결과값이 틀리게 나왔습니다. 확인한 바와 같이 조인에서는 조인 조건을 잘못 지정할 경우 틀린 데이터가 출력되기 때문에 아주 주의해야 합니다.
하지만 의도적으로 카지션 곱을 사용하는 경우도 있는데 쿼리의 성능테스트할 대량의 테스트용 테이블을 생성하는 경우가 대표적인 예입니다.

 

1. 부서 번호가 10번인 사원들의 정보를 조회합니다.

SELECT EMPNO, ENAME, JOB, SAL 
FROM EMP 
WHERE DEPTNO = 10;

 

2. 임의의 3건을 추출 합니다.

SELECT LEVEL C1 FROM DUAL CONNECT BY LEVEL <= 3;

 

SELECT * FROM 
(SELECT EMPNO, ENAME, JOB, SAL FROM EMP WHERE EMPNO = 10), 
(SELECT LEVEL C1 FROM DUAL CONNECT BY LEVEL <= 3)
// 조인 조건을 누락해서 카디션 곱 발생

C1이 1일 때 부서번호 10번 집합 한세트, 2일때 한세트, 3일때 한세트 총 3개 세트 집합이 생깁니다. 이런 형태로 데이터를 복제하기 위해서 카티션 곱을 사용합니다.

728x90