[Oracle/SQL] Join

JunHyeok Seo·2023년 8월 21일

database

목록 보기
4/5

조인의 필요성

RDBMS에서 정규화를 통해 데이터를 구조화한다. 이러한 과정에서 데이터들은 각 테이블 별로 분할되어 저장되는데, 질의문을 통해 유의미한 데이터를 추출하기 위해선 테이블들을 조인하는 과정이 필요하다.

Cross Join

특별한 키워드 없이 각 테이블을 콤마로 연결하면 Cross Join 된다. 조인 결과 테이블의 레코드 수는 두 테이블 레코드 수를 곱한 것과 같다.

SELECT FROM EMP, DEPT ⇒ EMP(14) DEPT(4) = 56개의 레코드

크로스 조인의 결과로 각 테이블의 정보가 결합되긴 했지만, 아무런 조건을 제시하지 않았기에 그 결과는 의미를 갖지 못한다.

조인 결과가 의미를 갖으려면 조인할 때 조건을 지정해야 한다!

종류설명
Equi Join동일 칼럼을 기준으로 조인
Non-Equi Join동일 칼럼이 없이 다른 조건을 사용하여 조인
Outer Join조인 조건에 만족하지 않는 행도 나타냄
Self Join한 테이블 내에서 조인

Non-Equi Join

테이블(EMP, SALGRADE)

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;

Self Join

똑같은 테이블을 합치는 조인이다. 한 테이블 내에서 데이터 간의 관계를 살펴봐야하는 경우. 컬럼 사이의 관계를 효과적으로 보여주기 위해 셀프조인을 사용한다. 기본적인 문법은 다른 조인과 같다.

SELF JOIN (上) : 같은 테이블을 조인하기

ANSI Join

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);

0개의 댓글