2-1-7. 조인
1. 조인 개요
- 두 개 이상의 테이블들을 연결해 데이터를 출력하는 것을 조인(JOIN)이라고 한다.
- 일반적으로 PK-FK 값의 연관에 의해 조인이 성립된다. 하지만, 어떤 경우에는 이러한 PK, FK의 관계가 없어도 논리적인 값들의 연관만으로 조인이 성립될 수 있다.
2. EQUI JOIN
- EQUI JOIN(등가 조인)은 두 개의 테이블 간에 칼럼 값들이 서로 '정확하게 일치'하는 경우에 사용되는 방법으로, 대부분 PK-FK 관계를 기반으로 한다. 물론, 항상 PK-FK 관계를 사용하는 것은 아니다.
다음은 EQUI JOIN의 대략적인 형태이다.
SELECT 테이블1.칼럼명, 테이블2.칼럼명, ...
FROM 테이블1, 테이블2
WHERE 테이블1.칼럼명 = 테이블2.칼럼명; ===> WHERE 절에 JOIN 조건을 기술한다.
같은 내용을 ANSI/ISO SQL 표준 방식으로 표현하면 아래와 같다.
SELECT 테이블1.칼럼명, 테이블2.칼럼명, ...
FROM 테이블1 INNER JOIN 테이블2
ON 테이블1.칼럼명 = 테이블2.칼럼명; ===> ON 절에 JOIN 조건을 기술한다.
3. Non EQUI JOIN
- Non EQUI JOIN은 두 개의 테이블 간에 논리적인 연관 관계를 가지고 있으나, 칼럼 값이 서로 일치하지 않는 경우에 사용된다. 여기서 일치하지 않다는 "!="를 의미하는 것이 아니라, BETWEEN, >, < 같은 연산자들을 사용해 JOIN을 수행한다는 뜻이다.
SELECT 테이블1.칼럼명, 테이블2.칼럼명
FROM 테이블1, 테이블2
WHERE 테이블1.칼럼명 BETWEEN 테이블2.칼럼명1 AND 테이블2.칼럼명2;
- 위의 BETWEEN 연산자에 의해, "테이블1.칼럼명"의 값이 "테이블2.칼럼명1" 이상 "테이블2.칼럼명2" 이하인 경우에 대하여 JOIN한다. 당연히, 모두 숫자형 또는 날짜형이어야 할 것이다.
4. 3개 이상 TABLE JOIN
- 아래처럼 3개 이상의 테이블에 대해 JOIN을 수행할 수 있다.
SELECT A.P_NAME, A.POS, B.R_NAME, B.T_NAME, C.STADIUM_NAME
FROM PLAYER A, TEAM B, STADIUM C
WHERE B.TEAM_ID = A.TEAM_ID AND C.STADIUM_ID = B.STADIUM_ID
ORDER BY P_NAME;
5. OUTER JOIN
- 앞서 다룬 EQUI JOIN, NON EQUI JOIN은 모두 조인 조건의 결과가 참인 행들만 반환하는 'INNER JOIN(내부 조인)'이다. OUTER JOIN은 조인 조건을 만족하지 않는 행들도 함께 반환할 때 사용한다.
- 단, OUTER JOIN은 NULL값을 발생시킬 가능성이 높기 때문에, 별도의 선언을 통해 OUTER JOIN을 수행해야 한다.
SELECT 테이블1.칼럼명, 테이블2.칼럼명, ...
FROM 테이블1, 테이블2
WHERE 테이블2.칼럼명(+) = 테이블1.칼럼명;
- 위의 경우에는, 모든 데이터를 표시할 테이블은 '테이블1'이다. (+)를 선언한 쪽 반대편에 있는 테이블이 OUTER JOIN의 기준 테이블이 되니... 주의해야 한다.
지금까지 조인에 대한 기본적인 사용법을 확인했다.
조인이 필요한 기본적 이유는 정규화(불필요한 데이터의 정합성을 확보하고 이상현상 발생을 피하기 위해 테이블을 분할해 생성하는 것)에서부터 시작된다.
관계형 데이터베이스의 큰 장점이면서 SQL 튜닝의 중요 대상이 되는 조인을 잘못 기술하면, 시스템 자원 부족이나 과다한 응답시간 지연을 발생시키는 중요 원인이 되므로, 조인 조건은 신중하게 작성해야 한다.