조인 (JOIN)
- JOIN은 각 테이블간에 공통된 걸럼(조건)으로 데이터를 합쳐 표현하는 것이다.
- JOIN에는 크게 INNER JOIN, OUTER JOIN이 있다.
▶ 예제 테이블을 통해 이해해보자.
TABLE 1) MEM : 회원테이블 (회원번호, 이름, 이메일, 부서번호)
TABLE 2) DEPART : 부서테이블 (부서번호, 부서명)
▶ 1. SELECT FROM을 이용한 조인
1.1) 회원 테이블과 부서 테이블의 조인
=> DEPART_ID가 공통 컬럼
=> MEM테이블의 DEPART_ID와 DEPART테이블의 DEPART_ID를 연결하여 준다.
ex)
SELECT MEM.MEM_ID, MEM.NAME, MEM.DEPART_ID, DEPART.DEPART_NAME
FROM MEM
, DEPART
WHERE MEM.DEPART_ID = DEPART.DEPART_ID;
1.2) 이때 테이블명이 긴 경우 일일이 그 테이블 명을 다 써주지 않고 별칭을 쓸 수 있다.
ex)
SELECT A.MEM_ID, A.NAME, A.DEPART_ID, B.DEPART_NAME
FROM MEM A
, DEPART B
WHERE A.DEPART_ID = B.DEPART_ID;
결과는 동일
▶ 2. ANSI 표준 조인 (JOIN절을 이용한 명시적 조인)
문법 =>
JOIN절을 명시적으로 선언하여 질의문을 작성할 수 도 있다.
SELECT 컬럼이름1, 컬럼이름2, ㆍㆍㆍ
FROM 테이블명1
JOIN 테이블명2
ON 테이블명1.컬럼명 = 테이블명2.컬럼명;
위의 쿼리를 이렇게 바꿔 작성할 수 있다.
SELECT A.MEM_ID, A.NAME, A.DEPART_ID, B.DEPART_NAME
FROM MEM A
JOIN DEPART B
ON A.DEPART_ID = B.DEPART_ID
▶ 3. 질의문 사용한 JOIN
3.1) 회원 테이블과 부서 테이블의 조인 (특정 회원 조회 EX) NAME이 ‘갓동수’ 인 회원)
3.1.1) SELECT FROM을 이용한 조인에 AND로 조건을 추가하여 조회 가능하다.
ex)
SELECT A.MEM_ID, A.NAME, A.DEPART_ID, B.DEPART_NAME
FROM MEM A
, DEPART B
WHERE A.DEPART_ID = B.DEPART_ID
AND A.NAME = '갓동수'
3.1.2) ANSI 표준 쿼리에서는 WHERE 문을 추가하여 조건 조회가 가능하다.
SELECT A.MEM_ID, A.NAME, A.DEPART_ID, B.DEPART_NAME
FROM MEM A
JOIN DEPART B
ON A.DEPART_ID = B.DEPART_ID
WHERE A.NAME = '갓동수';
▶ 4. 3개 이상(다중) 테이블 조인
ex TABLE Name = MOD_MEM_LOG : 회원정보 변경로그 (회원번호, 변경시간)
4.1) 회원 테이블과 부서 테이블의 조인 후 그 회원의 회원 수정 기록을 알고 싶다.
MEM_MOD_LOG 테이블을 추가하고, 공통 컬럼을 연결 시켜준다.
첫번째 방법) SELECT, FROM 절
SELECT A.MEM_ID, A.NAME, A.DEPART_ID, B.DEPART_NAME, C.LOG_TIME
FROM MEM A
, DEPART B
, MEM_MOD_LOG C
WHERE A.DEPART_ID = B.DEPART_ID
AND A.MEM_ID = C.MEM_ID
AND A.NAME = '갓동수';
두번째 방법) ANSI 표준쿼리
SELECT A.MEM_ID, A.NAME, A.DEPART_ID, B.DEPART_NAME, C.LOG_TIME
FROM MEM A
JOIN DEPART B
ON A.DEPART_ID = B.DEPART_ID
JOIN MEM_MOD_LOG C
ON A.MEM_ID = C.MEM_ID
WHERE A.NAME = '갓동수';
▶ 5. 아우터 조인 (LEFT, RIGHT, FULL OUTER JOIN)
EQUI JOIN 문장들의 한 가지 제약점은 그것들이 조인을 생성하려 하는 두개의 테이블의
두개 컬럼에서 공통된 값이 없다면 테이블로부터 데이터를 반환하지 못한다는 것이다.
- 정상적으로 저인 조건을 만족하지 못하는 행들을 보기위해 OUTER JOIN을 사용한다.
OUTER JOIN 연산자는 "(+)"이다.
- 조인시킬 값이 없는 조인측에 "(+)"를 위치 시킨다.
- OUTER JOIN 연산자는 표현식의 한 편에만 올 수 있다.
EX1 ) ‘사자’님의 회원 정보를 조회해보겠다. (부서명 까지 조인)
SELECT A.MEM_ID, A.NAME, A.DEPART_ID, B.DEPART_NAME
FROM MEM A
, DEPART B
WHER A.DEPART_ID = B.DEPART_ID
AND A.NAME = '사자';
위와 같은 정보가 나오는 것을 알 수 있다.
EX2) 그럼 '사자'님의 회원정보 수정 기록을 알기 위해 조인을 해보자.
SELECT A.MEM_ID, A.NAME, A.DEPART_ID, B.DEPART_NAME, C.LOG_TIME
FROM MEM A
, DEPART B
, MEM_MOD_LOG C
WHERE A.DEPART_ID = B.DEPART_ID
AND A.MEM_ID = C.MEM_ID
AND A.NAME = '사자';
아무런 결과가 나오지 않는다.
그 이유를 살펴보면 ‘사자’님은 한번도 회원정보를 수정한 적이 없기 때문이다.
회원 정보 수정 로그 (사자 MEM_ID : 0000000003)
회원 정보 수정 로그가 없더라도 회원 기본 정보를 보고 싶다면 이때 OUTER 조인을 사용하면 된다.
▶ 5.1) ORACLE에서의 OUTER조인
간단하게 말하여 데이터가 없을 수도 있는 쪽 JOIN 컬럼에 (+)를 추가하여 OUTER JOIN이 가능하다.
SELECT A.MEM_ID, A.NAME, A.DEPART_ID, B.DEPART_NAME, C.LOG_TIME
FROM MEM A
, DEPART B
, MEM_MOD_LOG C
WHERE A.DEPART_ID = B.DEPART_ID
AND A.MEM_ID = C.MEM_ID (+)
AND A.NAME = '사자';
위와 같이 회원정보 변경 이력이 없더라도 나머지 조인에 의한 결과행은 보여지도록 된다.
▶ 5.2) ANSI 표준 쿼리의 OUTER JOIN
- ANSI 표준에서의 OUTER JOIN은 LEFT, RIGHT OUTER 조인 2가지가 있다.
5.2.1) LEFT OUTER JOIN
이전의 JOIN ON 절에서 JOIN 앞에 LEFT OUTER를 붙여주면 된다.
ex)
SELECT A.MEM_ID, A.NAME, A.DEPART_ID, B.DEPART_NAME, C.LOG_TIME
FROM MEM A
JOIN DEPART B
ON A.DEPART_ID = B.DEPART_ID
LEFT OUTER JOIN MEM_MOD_LOG C
ON A.MEM_ID = C.MEM_ID
WHERE A.NAME = '사자';
▶ 5.3) FULL OUTER JOIN
양쪽 테이블에 다 Outer Join을 거는 것을 TWO-WAY OUTER JOIN 또는 FULL OUTER JOIN 이라 한다.