조인(JOIN)
Q .어떨 때 사용하는가?
-검색 하고자 하는 데이터가 여러 테이블에 분산되어 있는 경우 여러 테이블을 연결해서 필요한 데이터를 조회해야한다.
이렇게 여러 테이블을 연결해서 필요한 데이터를 조회하는 방법을 조인(join) 이라 한다.

조인의 종류
오라클 조인과 ANSI 조인
오라클에서 사용 가능한 조인의 종류는 오라클에서만 사용되는 오라클 조인과 오라클 이외의 DBMS 에서도 사용 가능한 ANSI 조인
2가지 방법이 있다. 2가지 방법은 문법만 다르고 동작 방식은 비슷하다.
- 오라클 조인 (oracle 8i)
- 카테시안 프로덕트
- equi 조인
- non-equi 조인
- outer 조인
- self 조인
2. ANSI 조인 (oracle 9i 이후)
- cross 조인
- natural 조인
- using (컬럼) 을 이용한 조인
- join ~ on 절
- left | right | full outer 조인
- self 조인
이번 포스팅에서는 오라클 조인에 대해서 정리해보도록 하겠다.
1, Equi 조인
(=)연산자 이용 조인
Equi 조인은 가장 많이 사용되는 조인 방법을 조인 대상이 되는 두 테이블에서 공통적으로 존재하는 컬럼의 값이
반드시 일치하는 행을 연결하여 데이터를 반환하는 조인이다.
일치하지 않는 데이터가 존재하는 경우에는 제외되며 대부분 기본키 (primary key) 를 가진 테이블 (master)과
참조키 (foreign key)을 가진 테이블(slave) 을 조인할 때 사용한다.
기본 문법
select 테이블1.컬럼, 테이블2.컬럼 (검색할 컬럼 명)
from 테이블1, 테이블2 (조인할 두 개의 테이블 명)
where 테이블1. 공통컬럼 = 테이블2. 공통컬럼 (공통으로 존재하는 컬럼의 조인 조건)
ex) 사원테이블과 부서테이블을 사원 번호 컬럼을 이용하여 equi 조인하여 사원 명과 부서 명을 출력하는 SQL 문
select last_name,department_name
from employees, departments
where employees.department_id = departments.department_id;
<공통 컬럼 모호성 제거>
위의 예시에서 select 절에 사용된 컬럼은 공통컬럼이 아니기 떄문에 컬럼명 앞에 테이블명을 지정하지 않아도 된다.
공통 컬럼 출력 시에는 select 절에 어느 테이블의 컬럼인지 명시해 주기 위해 컬럼명 앞에 테이블명을 반드시 적어주어야 한다.
<별칭 사용>
다음과 같이 테이블에 별칭을 사용하는 것 또한 가능하다.
select alias1.컬럼, alias2.컬럼
from 테이블1 alias1 , 테이블2 alias2
where alias1. 공통컬럼 = alias2. 공통컬럼
<검색 조건 추가>
오라클 조인에서는 where 절에 and 연산자 및 or 연산자를 사용하여 조인 조건에 검색 조건을 추가할 수 있다.
where 절에 조인 조건과 검색 조건을 같이 지정하기 때문에 어떤 문장이 조인 조건이고 검색 조건인지 쉽게 파악이
안되어 가독성이 떨어질 수 있다.
따라서 조인 조건을 먼저 명시하고 나중에 검색조건을 명시하는 방법으로 가독성을 향상 시킨다.
ex) 사원테이블과 부서테이블 조인시 검색조건으로 이름이 Whalen 사원만 검색하는 조건이 추가된 SQL문
select last_name,department_name,salary
from employees emp, departments dept
where emp.department_id = dept.department_id
and last_name='Whalen';
※주의
조인조건을 명시하지 않으면 두 테이블의 각 행이 결합한 곱집합이 생성되기 때문에 잘못된 데이터가 반환됨
= 카테시안 프로덕트
2. Cartesian Product
조인할 때 일치하는 데이터만 반환하지 않고 조인하는 각 테이블의 행 개수를 서로 곱한 결과가 반환된다.
따라서 유효한 데이터로 사용되지 못하며 일반적으로 조인 조건이 생략된 경우에 발생된다.
3. Non-Equi 조인
Non- Equi 조인은 where 절에 조인 조건을 지정할 때 동등 연산자 (=) 이외의 비교 연산자를 사용하는 조인을 의미한다.
ex) 직업 등급 테이블에 저장된 정보를 이용해 각 사원의 월급에 대한 등급을 알 수 있다.
between a and b 사용
select last_name,salary,grade_level
from employees e , job_grade g
where e.salary between g.lowest_sal and g.highest_sal;
4. Self 조인
equi 조인과 non-equi 조인은 모두 2개 또는 3개의 테이블을 사용하여 조인하는 방법
일반적으로 조인은 하나 이상의 테이블을 연결하여 원하는 데이터를 조회할 때 사용하지만 필요에 의해서
하나의 테이블만 사용하여 자기 자신을 조인할 수도 있다.
ex) self 조인하여 사원과 담당 관리자의 이름을 출력하는 SQL 문
select e.last_name 사원명 ,m.department_name 관리자명
from employees e , employees m
where e.employee_id = m.manager_id;
위의 예시는 하나의 테이블에 별칭을 이용하여 마치 여러개의 테이블을 사용하는 것처럼 조인하는 방법을 self 조인이라 한다.
따라서 반드시 테이블 별칭을 사용해야함
조인할 때 일치하는 데이터가 없으면 검색 결고에 누락되어 출력된다.
5. Outer 조인
조인의 실행결과는 반드시 조인 조건에 만족하는 데이터만 조회된다.
만약 조인 조건에 위배되면 누락되는데 이렇게 조인 조건에 일치하는 데이터만 조회하는 조인을 Inner 조인이라고 한다.
따라서 위에 언급한 조인들은 모두 Inner 조인에 해당하고 Outer 조인은 조인 조건에 만족하지 않아도
결과 값에 포함시키는 조인으로 (+) 연산자를 사용한다.
(+) 연산자는 조인하고자 하는 테이블 중에서 한 번만 사용할 수 있으며 일치하는 데이터가 없는 쪽에 지정한다.
(+) 연산자를 지정하면 내부적으로 한 개 이상의 null 을 가진 행이 생성되고 이렇게 생성된 null 행들과 데이터를 가진
테이블의 행들이 조인하게 되어 조건이 일치하지 않아도 결과값에 포함이 된다.
기본 문법
select 테이블1.컬럼, 테이블2.컬럼
from 테이블1, 테이블2
where 테이블1.공통컬럼 = 테이블2. 공통컬럼 (+);
위 문법에서 테이블2에 (+) 를 지정했기 때문에 조인조건과 일치하지 않는 테이블1의 데이터도 결과에 포함되어 출력된다. *반대 테이블
양쪽 테이블에 (+) 연산자를 동시에 사용할 수는 없으며 반드시 하나의 테이블에만 지정해야 한다.
ex) 관리자가 없는 사원 정보도 모두 포함하여 사원의 이름과 관리자 명을 출력하는 SQL 문
select e.last_name 사원명 ,m.department_name 관리자명
from employees e , employees m
where (+)e.employee_id = m.manager_id;
'SQL' 카테고리의 다른 글
| [SQL] 서브 쿼리 개념 | 단일행, 복수행 서브쿼리 | 인라인 뷰 (in-line-view) (0) | 2022.09.25 |
|---|---|
| [SQL] 조인(JOIN)- ANSI 조인 (0) | 2022.09.18 |