조인 (JOIN)
한 개 이상의 테이블에서 데이터를 조회하기 위해서 사용되는 것이 조인이다.
종류 | 설명 |
Equi Join | 동일 칼럼을 기준으로 조인한다 (inner join, simple join) |
NonEqui Join | 동일 칼럼 없이 다른 조건을 사용하여 조인한다 |
Outer Join | 조인 조건에 만족하지 않는 행도 나타낸다 |
Self Join | 한 테이블 내에서 조인한다 |
WHERE절에서 명시하는 조건이 FROM절에 명시한 여러 Table을 묶는 Join조건이 된다. 이러한 Join 조건은 반드시 묶어야할 Table 수보다 하나가 적다. 즉 Table 수가 n개라면 Join 조건은 n-1개가 된다.
1. Cross Join
2개 이상의 테이블이 조인될 때 WHERE절에 의해 공통되는 칼럼에 의한 결합이 발생 되지 않는 경우이다.
그렇기 때문에 테이블에 존재하는 모든 데이터가 검색 결과로 나타난다.
SQL> select * from emp, dept;
위와 같은 조인은 아무런 의미 없이 테이블들을 조합해 놓은 것으로 개발자의 실수로 발생되는 경우가 대부분이다.
조인 규칙
1) Primary Key와 Foreign Key열을 통한 다른 테이블의 행과 연결
2) 연결 Key 사용으로 테이블과 테이블이 결합
3) WHERE절에서 조인 조건을 사용 (조인 조건 개수 = 연결테이블 수 -1)
4) 명확성을 위해 칼럼 이름 앞에 테이블 명 또는 테이블 별칭을 붙인다.
2. Equi Join
가장 많이 사용하는 조인 방법. 조인 대상이 되는 두 테이블에서 공통적으로 존재하는 칼럼의 값이 일치되는 행을 연결하여 결과를 생성하는 조인 방법이다.
EMP 테이블과 DEPT 테이블의 공통 칼럼인 DEPTNO의 값이 일치되는 조건을 WHERE절에 사용한다.
두테이블을 조인하려면 일치되는 공통 칼럼을 사용해야 한다. 컬럼 명이 같게 되면 혼동이 오기 때문에 칼럼명 앞에 테이블명을 점(.)과 함께 기술한다.
SQL> select ename, dname
from emp, dept
where emp.deptno=dept.deptno;
조인은 Primary Key와 Foreign Key를 통한 다른 테이블 행과 연결한다.
부서 테이블의 Primary Key인 부서번호가 사원 테이블의 Foreign Key로 설정되어 있다.
이 연결 Key를 WHERE 절에서 조인 조건에 사용하였다. 비교 연산자로 "="을 사용했으므로 이를 Equi Join이라고 한다.
테이블명도 별칭 지정이 가능하다
FROM 테이블명1 [별칭1], 테이블명2 [별칭2]
SQL> select e.ename, d.dname
from emp e, dept d
where e.deptno=d.deptno and e.ename='SCOTT';
3. Non-Equi Join
조인할 테이블 사이에 칼럼의 값이 직접적으로 일치하지 않을 시 사용하는 조인으로 '='을 제외한 연산자를 사용한다.
SQL> select e.ename, e.sal, s.grade
from emp e, salgrade s
where e.sal between s.losal and s.hisal;
급여등급을 5개로 나누어 놓은 SALGRADE 테이블에서 정보를 얻어 와서 각 사원의 급여 등급을 지정할 때 EMP 테이블과 SALGRADE 테이블을 조인해야 한다.
4. Outer Join
행이 조인 조건에 만족하지 않을 경우 그 행은 나타나지 않게 된다. 이때 조인 조건에 만족하지 않는 행들도 나타내기 위해 Outer Join이 사용된다.
Q) 사원 테이블과 부서 테이블을 조인하여 사원 이름과 부서번호와 부서명을 출력
SQL> select e.ename, d.deptno, d.dname
from emp e, dept d
where e.deptno=d.deptno
order by d.deptno;
조인 결과를 보면 40번 부서가 출력되지 않은걸 확인 할 수 있다. 이유는 사원 테이블에 부서번호는 40번이 존재하지 않기 때문이다.
부서테이블의 40번 부서를 출력하려면 Outer Join을 사용해야한다.
사용기호는 (+)이고, 조인 조건에서 정보가 부족한 칼럼명 뒤에 위치하게 하면 된다.
SQL> select e.ename, d.deptno, d.dname
from emp e, dept d
where e.deptno(+)=d.deptno
order by d.deptno;
Outer Join을 이용해서 40번 부서가 출력된걸 확인 할 수 있다.
5. Self Join
말 그대로 자기 자신과 조인을 맺는 것을 말한다. FROM절 다음에 동일한 테이블 명을 2번 기술하고 WHERE절에도 조인 조건을 주어야 하는데 이때 서로 다른 테이블인 것처럼 인식할 수 있도록 별칭을 사용한다.
Q) 특정 사원을 담당하는 매니저 사원의 이름을 출력 출력
SQL> select ename, mgr
from emp;
EMP테이블에 별칭을 사용하여 하나의 테이블을 두 개의 테이블인 것처럼 사용하려면 WORK(사원 테이블)과 MANAGER(매니저 테이블)로 별칭을 부여한다.
SQL> select work.ename, manager.ename
from emp work, emp manager
where work.mgr=manager.empno;
Q) 사원의 이름과 그의 매니저 이름을 출력
SQL> select work.ename || '의 매니저는' || manager.ename || '이다'
as "그 사원의 매니저"
from emp work, emp manager
where work.mgr=manager.empno;
6. ANSI Join
ANSI(미국표준연구소) SQL은 대부분의 상용 데이터베이스 시스템에서 표준 언어이다.
다른 DBMS와의 호환성을 위해서는 ANSI 조인을 사용하는 것이 좋다.
1) ANSI Cross Join
이전에는 쉼표(,)로 테이블 명을 구분하였으나 쉼표 대신 CROSS JOIN 이라고 명확하게 지정
SQL> select *
from emp cross join dept;
2) ANSI Inner Join
앞서 배운 조인 구문 중 공통 칼럽을 '='비교 연산자를 통해 같은 값을 가지는 로우를 연결하는 형태나 ANSI Inner Join은 다음과 같은 형식으로 작성한다
select * from 테이블1 inner join 테이블2
on 테이블1.컬럼1 = 테이블2.컬럼2
3) USING을 이용한 조인 조건 지정
두 테이블 간의 조인 조건에 사용되는 칼럼이 같다면 on대신 using을 사용할 수 있다
select * from 테이블1 inner join 테이블2
using (공통칼럼)
4) NATURAL Join
조건 절을 생략하고 natural join을 사용하면 자동적으로 모든 칼럼을 대상으로 공통 칼럼을 조사하여 내부적으로 조인문을 생성한다.
select * from 테이블1 natural join 테이블2
5) ANSI Outer Join
기존 조인에서는 반드시 모든 레코드가 출력되어야 하는 경우 '(+)'를 표시했다.
하지만 ANSI구문의 outer join에서는 이전에 지원하지 않았던 full까지 지원한다
select * from 테이블1 [left|right|full] outer join 테이블2