본문 바로가기
Dev/Database

SQL - JOIN 조인 1 (Equi Join, Non-Equi Join )

by vellahw 2022. 8. 30.

(Oracle DB 사용 / 툴: SQL Developer / scott 계정 사용) 

 

 

* Join (조인) 이란

관계형 데이터베이스에서는 테이블간의 관계가 중요하기 때문에 하나 이상의 테이블이 빈번히 결합되어 사용된다.

한 개 이상의 테이블에서 원하는 결과를 얻기 위해 사용 되는 것이 Join이다.

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

 

0. Cross Join

2개 이상의 테이블이 조인될 때 where 절에 의해 공통되는 칼럼에 의한 결합이 발생 되지 않는 경우를 말한다.

다음은 cross join으로 특별한 키워드 없이 select 문의 from 절에 emp 테이블과 dept 테이블을 동시에 기술한 예제인데

select *
from emp, dept;

위와 같은 조인은 아무런 의미 없이 테이블을 조합해 놓은 것으로 개발자의 실수로 발생 되는 경우가 대부분이다.

따라서 기본적으로 조인은 다음과 같은 규칙을 준수해야 한다.

  1. Primary Key와 Foreign Key열을 통한 다른 테이블의 행과 연결한다.
  2. 연결 Key 사용으로 테이블과 테이블이 결합한다.
  3. where 절에서 조인 조건을 사용한다. (조인 조건 개수 = 연결 테이블 수 -1)
  4. 명확성을 위해 칼럼 이름 앞에 테이블명 또는 테이블 별칭을 붙인다.

 

 

1. Equi Join

가장 많이 사용하는 조인 방법으로,

조인 대상이 되는 두 테이블에서 공통적으로 존재하는 칼럼의 값이 일치되는 행을 연결하여 결과를 생성하는 조인 방법이다.

 

ex-1) 부서번호가 같은 사원의 이름과 부서 이름을 출력하기

select ename, dname
from emp, dept
where emp.deptno = dept.deptno;

 

두 테이블을 조인 하려면 일치되는 공통 칼럼을 사용해야 하기 때문에

emp 테이블과 dept 테이블의 공통 칼럼인 deptno 값이 일치(=) 되는 조건을 where 절에 사용한다.

칼럼명이 같게 되면 혼동이 오기 때문에 칼럼명 앞에 테이블명을 점(.)과 함께 기술함

조인한 결과를 보면 부서번호를 기준으로 같은 값을 가진 사원 테이블과 부서 테이블이 결합 되었다.

(▼ 사원 테이블과 부서 테이블)

사원 테이블- 사원 이름과 부서 번호 (대표적으로 smith와 allen만 캡쳐함)
부서 테이블 - 부서 번호와 부서이름

 

부서 테이블의 Primary Key인 부서번호가 사원 테이블의 Foreign Key로 설정되어 있다.

이 연결 Key를 where 절에서 조인 조건에 사용하고 비교 연산자로 '='를 사용 하였으므로 이를 Equi Join 이라고 한다.

 

* 테이블 명이 너무 긴 경우에는 테이블 명에 간단하게 별칭을 부여해서 문장을 간단하게 기술 할 수 있다.

테이블 명의 별칭은 from 절 다음에 테이블 이름을 명시하고 공백을 둔 다음 지정한다.

select e.ename, d.dname, e.deptno, d.deptno
from emp e, dept d
where e.deptno = d.deptno;

DEPTNO: emp 테이블 / DEPTNO_1: dept 테이블

 

 

ex-2) 부서번호가 같은 사원의 이름과 부서 이름을 출력하는데 이름이 SCOTT인 사람의 정보만 출력하기

위 예제에서 이름이 SCOTT인 사람의 정보만 출력하기 위해서는 where 절에서 and 연산자를 추가하면 된다.

select e.ename, d.dname
from emp e, dept d
where e.deptno = d.deptno and e.ename = 'SCOTT';

 

 

 

2. Non-Equi Join

조인할 테이블 사이에 칼럼의 값이 직접적으로 일치하지 않을 시 사용하는 조인으로,

'='을 제외한 연산자를 사용한다.

 

 ex) 급여 등급 테이블에서 정보를 얻어와서 각 사원의 급여 등급 지정하기

먼저 급여 등급을 5개로 나누어 놓은 테이블인 SALGRADE 테이블을 살핀다.

select *
from salgrade;

급여가 700~1200 사이면 1등급

급여가 1201~1400 사이면 2등급

급여가 1401~2000 사이면 3등급

급여가 2001~300 사이면 4등급

급여가 3001~999 사이면 5등급

 

급여 등급을 지정하기 위해 emp 테이블과 salgrade 테이블을 조인한다.

select e.ename, e.sal, s.grade
from emp e, salgrade s
where e.sal between s.losal and s.hisal;

 (* between and 연산자: salgrade 테이블의 losal과 hisal 사이에 있는 emp 테이블의 sal을 출력) 

급여가 800인 SMITH는 1등급(급여가 700~1200 사이)

급여가 1250인 WARD는 2등급(급여가 1201~1400 사이)

등을 확인 가능!

위  where 절은 and 연산자를 사용하여 다음과 같이 기술 할 수도 있다.

where e.sal >= s.losal and e.sal <= s.hisal

 

'Dev > Database' 카테고리의 다른 글

JDBC 프로그래밍  (0) 2022.09.06
데이터베이스 프로그래밍  (0) 2022.09.05
SQL - JOIN 조인 2 (Outer Join, Self Join)  (0) 2022.08.31
SQL - 그룹 함수 2 (group by문과 having 조건)  (0) 2022.08.30
SQL - 그룹 함수 1  (0) 2022.08.30

댓글