JOIN(조인)
1. 개념
두 개 이상의 테이블을 연결하여 데이터를 검색하는 방법이다.
2. 유형
- 논리적 조인 : 사용자 SQL 문에 표현되는 테이블 결합 방식
- 물리적 조인 : 데이터베이스 옵티마이저에 의해 내부적으로 발생하는 테이블 결합 방식
3. 논리적 조인
(1) INNER JOIN(내부 조인)
- 공통 존재 컬럼의 값이 같은 경우를 추출
- 조인 대상이 되는 컬럼을 명시적으로 선언하기 위하여 ON 조건절 사용된다.
- SELECT A.컬럼1, A.컬럼2, ..., B.컬럼1, ... FROM 테이블1 A JOIN 테이블2 B ON 조인조건 WHERE 검색조건;
같은 이름의 컬럼이 여러 테이블에 있는 경우, 별칭.컬럼명 형태로 명시
WHERE 절은 생략가능
(2) OUTER JOIN(외부 조인)
1) LEFT OUTER JOIN
- JOIN을 기준으로 왼쪽 테이블의 모든 데이터와 오른쪽 테이블의 동일 데이터를 추출
- SELECT A.컬럼1, A.컬럼2, ..., B.컬럼1, ... FROM 테이블1 A LEFT JOIN 테이블2 B ON 조인조건;
2) RIGHT OUTER JOIN
- JOIN을 기준으로 오른쪽 테이블의 모든 데이터와 왼쪽 테이블의 동일 데이터를 추출
- SELECT A.컬럼1, A.컬럼2, ..., B.컬럼1, ... FROM 테이블1 A RIGHT JOIN 테이블2 B ON 조인조건;
ex) SELECT B.HH, COUNT(A.HOUR) AS COUNT FROM (SELECT TO_CHAR(DATETIME, 'HH24') AS HOUR FROM ANIMAL_OUTS) A RIGHT OUTER JOIN (SELECT ROWNUM - 1 AS HH FROM DUAL CONNECT BY LEVEL <= 24) B ON A.HOUR = B.HH GROUP BY B.HH ORDER BY B.HH;
/* 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬 */
CONNECT BY LEVEL : 1~n까지 순차적인 숫자 생성, 필요한 부분에서 <= 등으로 제한하기
3) FULL OUTER JOIN
- 양쪽 테이블의 모든 데이터를 추출
- SELECT A.컬럼1, A.컬럼2, ..., B.컬럼1, ... FROM 테이블1 A FULL JOIN 테이블2 B ON 조인조건;
(3) CROSS JOIN(교차 조인)
- 조인 조건이 없는 모든 데이터 조합을 추출, 따라서 중복 발생 가능
- SELECT 컬럼1, 컬럼2, ... FROM 테이블1 CROSS JOIN 테이블2;
(4) SELF JOIN(셀프 조인)
- 자기 자신에게 별칭 지정한 후 다시 조인
- SELECT A.컬럼1, A.컬럼2, ..., B.컬럼1, ... FROM 테이블1 A JOIN 테이블1 B ON 조인조건;
4. 물리적 조인
(1) NESTED-LOOP JOIN(중첩 반복 조인)
- 2개 이상의 테이블에서 하나의 집합을 기준으로 순차적으로 상대방 ROW를 결합하여 원하는 결과를 조합하는 방식
- 먼저 선행 테이블의 처리범위를 하나씩 엑세스하면서 추출된 값으로 연결할 테이블을 조인한다.
- 좁은 범위에서 유리한 성능, 순차적으로 처리, 임의 접근(RANDOM ACCESS) 위주, 인덱스 생성이 필요
- 실행속도 = 선행 테이블 사이즈 X 후행 테이블 접근 횟수
(2) SORT-MERGE JOIN(정렬 합병 조인)
- 조인 대상 범위가 넓을 경우 발생하는 임의 접근을 줄이거나, 연결고리에 마땅한 인덱스가 존재하지 않을 경우 사용
- 양쪽 테이블의 정렬한 결과를 차례로 검색하며 연결고리 형태로 합병
- 연결을 위해 임의 접근하지 않고 스캔을 하면서 수행, 선행집합 개념이 없다.
- 정렬을 위한 영역에 따라 효율에 큰 차이 발생
- 조인 연산자가 = 이 아닌 경우에는 중첩반복조인보다 유리
(3) HASH JOIN(해시 조인)
- 해싱 함수를 활용
- 직접적인 연결을 담당하는 것이 아니라 연결될 대상을 특정 지역에 모아두는 역할만을 담당
- 대용량 처리 선결조건인 임의 접근과 정렬에 대한 부담을 해결가능
- 비용기반 옵티마이저에서만 가능, CPU 성능에 의존적이다.
- 순차적인 처리 형태로 수행