테이블 조인
관계형 데이터베이스의 주요 연산중 하나
다수개의 테이블에 분산된 자료를 테이블 간에 설정된 관계를 이용하여 참조하는 연산
구분
. 일반조인, ANSI 조인
. 내부조인, 외부조인--조인 가지수가 더 많은 것이 외부 적은것이 내부(외부조인의 사용은 자제하는 것이 좋음)
. 동등조인, 세미조인, 안티조인(넌이퀴조인), 카타시안조인(조인 조건이 잘못 사용된 경우), 등등
1. 일반조인과 ANSI 조인
2. 내부조인
1) 동등조인(Equi - JOIN)
- 조인조건에 '=' 연산자가 사용된 조인
- 가장 일반적인 조인 형식
(사용형식: 일반조인)
SELECT 컬럼list
FROM 테이블명1 [별칭1], 테이블명2 [별칭2],테이블명3 [별칭3],...]
-- 별칭 반드시 기술, 서브퀴리가 올수 있음 (독립적으로 실행되야함)
WHERE 조인조건
[AND 일반조건] --OR 연결은 없음
. '조인조건': 사용된 테이블들 간 동일한 데이터를 가진 컬럼명 '='연산자로 연결한 조건
. 조인조건의 갯수는 적어도 테이블의 수-1개 이상이어야 함 --더나와도 상관없지만 덜 나오면 안됨
. '일반조건'과'조인조건'의 기술 순서는 수행과 관계없음 --섞여 기술해도 상관없음
(사용형식: ANSI 조인)
SELECT 컬럼list
FROM 테이블명1 [별칭1] --테이블명1과 2는 반드시 직접조인되어야 한다.(공통 컬럼을 반드시 가져야함) 아니면 오류
INNER JOIN 테이블명2 [별칭2] ON (조인조건1 [AND 일반조건1])
[INNER JOIN 테이블명3 [별칭3] ON (조인조건2 [AND 일반조건2])]
--3번째테이블은 1과 2의 결과와 조인되어지는 것(그래서 테이블명 1과 3은 공통 컬럼이 없어도됨)
:
[WHERE 조인조건n] --테이블명 1~3까지 모두 연결된 것만 WHERE절에 작성 가능
. '테이블명1'과 '테이블명2'는 반드시 직접 조인 가능해야함
. '테이블명3'은 '테이블명1', '테이블명2' 조인 결과와 조인
. '일반조건1'은 '테이블명1', '테이블명2'에만 관련된 조건
. '일반조건n'은 모든 테이블에 공통으로 적용되는 조건
사용예) 사원테이블에서 2005년 이후 입사한 사원들을 조회하시오.
Alias는 사원번호, 사원명, 부서명, 입사일이다.
(일반조인)
SELECT A.EMPLOYEE_ID AS 사원번호,
A.EMP_NAME AS 사원명, --ENP 테이블에만 있어서 별칭을 안써도 되지만 써야대..
B.DEPARTMENT_NAME AS 부서명,
A.HIRE_DATE AS 입사일
FROM HR.EMP A, HR.DEPT B
WHERE EXTRACT (YEAR FROM A.HIRE_DATE)>='2008' --일반조건
AND A.DEPARTMENT_ID = B.DEPARTMENT_ID
ORDER BY 3;
(ANSI 조인)
SELECT A.EMPLOYEE_ID AS 사원번호,
A.EMP_NAME AS 사원명, --ENP 테이블에만 있어서 별칭을 안써도 되지만 써야대..
B.DEPARTMENT_NAME AS 부서명,
A.HIRE_DATE AS 입사일
FROM HR.EMP A
INNER JOIN HR.DEPT B ON( A.DEPARTMENT_ID = B.DEPARTMENT_ID
AND EXTRACT(YEAR FROM A.HIRE_DATE)>=2008) --일반조건
ORDER BY 3;
사용예) 미국에있는 부서별 인원수를 조회하시오 -- 조건: 미국내 US인 DEPARTMENT만 구해야함
Alias는 부서코드, 부서명, 인원수 --부서 코드와 부서명은 같은 값
SELECT B.DEPARTMENT_ID AS 부서코드,
A.DEPARTMENT_NAME AS 부서명,
COUNT(*) AS 인원수
FROM HR.DEPT A, HR.EMP B, HR.LOCATIONS C
WHERE B.DEPARTMENT_ID = A.DEPARTMENT_ID
AND A.LOCATION_ID = C.LOCATION_ID
AND C.COUNTRY_ID = 'US'
GROUP BY B.DEPARTMENT_ID, A.DEPARTMENT_NAME
ORDER BY 1;
(ANSI 조인)
사용예) 2005년도 5월 거래처별 매입현황을 조회하시오 --매입은 BUYPROD
Alias는 거래처코드, 거래처명, 매입수량, 매입금액이다.
SELECT C.BUYER_ID AS 거래처코드,
C.BUYER_NAME AS 거래처명,
SUM(A.BUY_QTY) AS 매입수량합계,
SUM(A.BUY_QTY * B.PROD_COST) AS 매입금액합계
FROM BUYPROD A, PROD B, BUYER C
WHERE A.BUY_PROD = B.PROD_ID
AND B.PROD_BUYER = C.BUYER_ID
AND A.BUY_DATE BETWEEN TO_DATE('20050501') AND TO_DATE('20050531')
GROUP BY C.BUYER_ID, C.BUYER_NAME
ORDER BY 1;
(ANSI 조인)