RDBMS에서 정규화를 통해 데이터를 구조화한다. 이러한 과정에서 데이터들은 각 테이블 별로 분할되어 저장되는데, 질의문을 통해 유의미한 데이터를 추출하기 위해선 테이블들을 조인하는 과정이 필요하다.
특별한 키워드 없이 각 테이블을 콤마로 연결하면 Cross Join 된다. 조인 결과 테이블의 레코드 수는 두 테이블 레코드 수를 곱한 것과 같다.
SELECT FROM EMP, DEPT ⇒ EMP(14) DEPT(4) = 56개의 레코드
크로스 조인의 결과로 각 테이블의 정보가 결합되긴 했지만, 아무런 조건을 제시하지 않았기에 그 결과는 의미를 갖지 못한다.
조인 결과가 의미를 갖으려면 조인할 때 조건을 지정해야 한다!
| 종류 | 설명 |
|---|---|
| Equi Join | 동일 칼럼을 기준으로 조인 |
| Non-Equi Join | 동일 칼럼이 없이 다른 조건을 사용하여 조인 |
| Outer Join | 조인 조건에 만족하지 않는 행도 나타냄 |
| Self Join | 한 테이블 내에서 조인 |
select sal from emp;
--14명 직원의 sal 정보
select * from salgrade;
--sal 범위별 등급 정보
--1 700 1200
--2 1201 1400
--3 1401 2000
--4 2001 3000
--5 3001 9999
각 테이블에 공통된 컬럼은 없지만, salgrade의 범위 정보를 활용하여 emp 테이블의 직원들 소득에 따른 grade 계산 가능.
select ename, sal, grade from emp, salgrade
where sal >= losal and sal <= hisal;
select ename, sal, grade from emp, salgrade
where sal between losal and hisal;
select e.ename, e.sal, s.grade from emp e, salgrade s --별칭부여
where e.sal between s.losal and s.hisal;
똑같은 테이블을 합치는 조인이다. 한 테이블 내에서 데이터 간의 관계를 살펴봐야하는 경우. 컬럼 사이의 관계를 효과적으로 보여주기 위해 셀프조인을 사용한다. 기본적인 문법은 다른 조인과 같다.
ANSI 표준으로 정해진 Join 문법이다. ANSI 표준을 따르는 DB에서 사용할 수 있다. 조인의 종류는 위와 같으나 표현방법이 다르다.
-- ANSI JOIN
-- ANSI(미국 표준협회) 표준안에 따라서 만들어진 join방법
-- ANSI CROSS JOIN
select * from dept cross join emp; -- 4 * 14 = 56개 데이터 검색
select * from emp cross join dept; -- 14 * 4 = 56개 데이터 검색
-- ANSI INNER JOIN : 등가조인과 같은 의미를 가지고 있는 조인방법
--Q. SCOTT 사원이 소속된 부서명을 출력하는 SQL문을 ANSI INNER JOIN으로 작성
select ename, dname from dept inner join emp
on dept.deptno = emp.deptno where ename = 'SCOTT';
-- using을 이용해서 조인
select ename, dname from dept inner join emp
using(deptno) where ename = 'SCOTT';
-- ANSI NATURAL JOIN
-- DEPT와 EMP 테이블 사이의 공통 컬럼이 존재한다는 의미. 별도로 컬럼을 작성할 필요가 없다.
select ename, dname from dept natural join emp where ename = 'SCOTT';
-------------------------------------------------------------------------
-- ANSI OUTER JOIN
-- 형식 : select * from table1 [left | right | full] outer join table2;
--1. dept01 테이블 생성
create table dept01( deptno number(2), dname varchar2(14) );
insert into dept01 values(10, 'ACCOUNTING');
insert into dept01 values(20, 'RESEARCH');
select * from dept01;
--2. dept02 테이블 생성
create table dept02( deptno number(2), dname varchar2(14) );
insert into dept02 values(10, 'ACCOUNTING');
insert into dept02 values(30, 'SALES');
select * from dept02;
--3. left outer join : dept01 테이블을 기준으로 출력됨
select * from dept01 left outer join dept02 using(deptno);
--4. right outer join : dept02 테이블을 기준으로 출력됨
select * from dept01 right outer join dept02 using(deptno);
--5. full outer join : dept01, dept02 테이블의 모든 정보가 출력됨
select * from dept01 full outer join dept02 using(deptno);