오라클에서 제일 중요한 것 중에 하나인 JOIN(조인)에 대해서 이야기 해보려고 한다. JOIN(조인)은 면접에 가면 무조건 물어볼 만큼 중요하다고 한다. 예를 들면, INNER JOIN (내부 조인) 과 OUTER JOIN(외부 조인)의 차이점은 무엇인가? JOIN과 UNION 의 차이점은 무엇인가? 등등 면접에서 자주 언급되는 주제라고 볼 수 있다. 그렇다면, 이렇게 중요하다고 하는 JOIN 이란 무엇인가? JOIN은 테이블(뷰) 과 테이블(뷰)을 합치는 것을 말한다. 여기서 JOIN 은 행(ROW) 과 행(ROW)을 합치는 것이 아니라 컬럼(COLUMN) 과 컬럼(COLUMN) 을 합치는 것이다. 행과 행을 합치는 것은 UNION 연산자로 다음에 이야기 하도록 하겠다. JOIN은 SQL 1992 CODE 방식과 SQL 1999 CODE 방식(ANSI) 가 존재하는데, 여기서는 SQL 1999 방식으로만 설명하도록 하겠다.
SQL 1992 CODE 방식은 테이블( 또는 뷰 ) 과 테이블( 또는 뷰 ) 사이에 JOIN 이라는 단어를 넣어주면 된다. JOIN 에 대해서 이해하기 위해서는 수학에서 사용되는 데카르트곱( 수학 ) 에 대해서 이해해야 할 필요가 있다. 예를 통해서 자세히 설명하도록 하겠다.
집합 A = { 1 , 2 , 3 } => 원소가 3개
집합 B = { a , b } => 원소가 2개
A ⊙ B = { (1,a) , (1,b) , (2,a) , (2,b) , (3,a) , (3,b) }
-- ⊙ 이 기호를 데카르트 곱이라고 한다.
위에서 볼 수 있듯이 , 데카르트의 곱은 모든 경우의 수를 구해주는것이다.
이는 원소의 곱 3*2 = 6개 와 같다.
이처럼 , 행의 개수가 다른 테이블( 또는 뷰 ) 를 JOIN 할 경우에는 데카르트 곱과 같은 방식으로 진행된다면 이해하기가 좀 더 쉬울 것이다.
SELECT *
FROM EMPLOYEES CROSS JOIN DEPARTMENTS
위의 구문을 실행하면 다음과 같은 결과가 나오게 된다. 쉽게 설명하자면, EMPLOYEES 에는 107행 이 있고, DEPARTMENTS 는 행이 27개가 있다. 위에서 처럼 집합으로 바꾸어 설명해보도록 하겠다.
( 테이블 이지만 집합이라 가정 ) EMPLOYEES = {E행1, E행2 , E행3 ,E행4 ......E행 107 }
( 테이블 이지만 집합이라 가정 ) DEPARTMENTS = { D행1. D행2 . .... D행 27 }
SELECT *
FROM EMPLOYEES CROSS JOIN DEPARTMENTS
다음을 실행하면,
{ (E행1, D행1) , (E행1, D행2 ) ...... (E행 107 , D행 26 ) , (E행 107 , D행 27 ) }
다음과 같이 된다는 것이다. 행과 행이 하나씩 모든 경우의 수를 구하듯이 연결된다고 생각하면 될 것 같다.
그렇다면, 다음으로 INNER JOIN 과 OUTER JOIN의 차이점에 대해서 알아보자. 우선, 앞에서 쓴 CROSS JOIN 과의 차이점을 알아야하는데, CROSS JOIN은 ON 절 ( JOIN 조건절 ) 을 무조건 필요로 하지 않는다. 반면에 , INNER JOIN 은 ON 절 ( JOIN 조건절 ) 이 무조건적으로 필요하다. 또한 , OUTER JOIN도 ON절 ( JOIN 조건절) 이 필요하다. 다음으로, INNER JOIN 과 OUTER JOIN 의 실행방법을 서술해 보도록 하겠다.
SELECT *
FROM employees E
INNER JOIN departments D -- INNER 는 생략 가능하다.
-- INNER JOIN 은 JOIN 조건절에 맞는 행만 메모리에 로딩한다.
-- 즉, 위의 SQL 문을 실행하면 department_id 가 NULL 인 employee 를 출력하지 못한다.
ON E.department_id = D.department_id
SELECT *
FROM employees E
LEFT OUTER JOIN -- => ( LEFT or RIGHT or FULL) (OUTER) JOIN
--> OUTER는 생략이 가능하다.
--> LEFR OUTER JOIN 은 왼쪽에 기술된 employees 테이블의 모든 행 ( 107개 ) 을
--> 출력해 준 다음에 조인 조건절인 E.department_id = D.department_id 으로 매핑해준다.
--> 그래서, 위의 SQL 문을 실행하면 department_Id 가 NULL인 employee 까지 출력할 수 있다.
ON E.department_id = D.department_id ;
- INNER JOIN 은 JOIN 조건절에 해당하는 부분을 매핑해서 추출해주는 것이다. 반면에 , OUTER JOIN 은 JOIN 조건에 해당하는 부분을 매핑해주기 전에, JOIN의 오른쪽(RIGHT) 또는 왼쪽(LEFT) 또는 둘다(FULL)의 행을 모두 뽑아준 후에 JOIN 조건절에 해당하는 부분을 매핑해주는 것이다. JOIN 은 매우 중요하니 잘 익혀둬야 한다고 한다. 그리고, 다음에 JOIN에 대해서 다른 부분에 대해서 다음 오라클 비긴즈에서 설명하도록 하겠습니다.
''국비지원'의 시작' 카테고리의 다른 글
오라클 비긴즈 07 ( SQL (Structure Query Language) ) (0) | 2023.02.14 |
---|---|
오라클 비긴즈 06 ( Set Operator [ UNION ] ) (0) | 2023.02.13 |
오라클 비긴즈 04 ( GROUP BY절 , GROUPING SETS , ROLLUP ) (0) | 2023.02.09 |
오라클 비긴즈 03 ( VIEW ) (0) | 2023.02.07 |
오라클 비긴즈 02 ( 기타함수 (CASE WHEN ... 함수 , DECODE 함수 ) ) (0) | 2023.02.06 |