DATABASE(oracleDB 11g)/SQL

[SQL]조인(JOIN)의 기초-Equi join 과 Non-Equi Join

SEUNGSAMI 2019. 1. 29. 17:24

조인(JOIN)의 기초 - Equi Join

과 Non-Equi Join



Equi Join

#EQUI JOIN 은 조인 조건식에 '='를 사용한다.

내가 한개의 테이블의 열의 정보를 알고있고 그것에 대한 다른 테이블의 정보를 알고 싶을때 

예를들어

1
2
3
4
5
6
7
select department_id
from employees
where employee_id = 110;
 
select department_name
from departments
where department_id = 100;
cs

이와같이 해당 employees 테이블의 department_id를 연관된 departments 테이블의 department_name을 알고싶을때 위의 예시와같이 select문을 두번을 써야할때 JOIN을 쓸 수 있다.


JOIN은 두개의 테이블을 합쳐서 하나의 테이블인 것 처럼 보여준다.

기본적으로 두개의 테이블을 한개의 select문을 실행했을 경우(기본적인 JOIN) 특별한 조건을 주지 않으면 행이 곱연산으로 표현된다.


이때 두 테이블에서 공통적으로 존재하는 컬럽의 값이 일치되는 행을 연결해서 결과를 생성하는 것을 equal join이라 한다.


위의 예시를 where을 이용해서 수정한 예이다.

1
2
3
4
select department_name
from employees, departments
where employees.department_id = departments.department_id
and employee_id = 110
cs


다음과 같이 약칭을 주어 줄여쓰는 것이 가능하다.

1
2
3
4
select d.department_name
from employees e, departments d
where e.department_id = d.department_id
and e.employee_id = 110;
cs


다음은 위의 예시를 JOIN을 이용한 예이다.

1
2
3
4
5
select d.department_name
from employees e
join departments d
on e.department_id = d.department_id
where e.employee_id = 110;
cs


다음은 두 구문이 같은 결과를 나타낸다.

1
2
3
4
5
6
7
8
9
10
select e.employee_id, e.last_name, e.job_id, j.job_title
from employees e
join jobs j
on e.job_id = j.job_id
where e.employee_id = 120;
 
select e.employee_id, e.last_name, e.job_id, j.job_title
from employees e, jobs j
where e.job_id = j.job_id
and e.employee_id = 120;

cs


3개의 테이블을 나타낼때도 JOIN을 사용할 수 있는데 주의할 점으로는 한개에서 두개를 무는 방법이 있고, 한개씩 무는 방법이 있다.


다음은 한개씩 무는 방법을 사용한 JOIN이다

1
2
3
4
5
6
7
select e.employee_id, e.last_name, d.department_name, j.job_title
from employees e
join departments d
on e.department_id = d.department_id
join jobs j
on e.job_id = j.job_id
order by e.last_name asc;
cs

다음은 한개의 테이블이 두 테이블을 무는 방법을 사용한 JOIN이다.

1
2
3
4
5
select e.employee_id, e.last_name, d.department_name, j.job_title
from employees e, departments d, jobs j
where e.department_id = d.department_id
and e.job_id = j.job_id
order by e.last_name asc;
cs

위의 두 예제는 결과가 같다.


다음의 두 예제는 결과가 같다.

2005년 상반기에 입사한 직원의 employee_id, last_name, hire_date, department_name, job_title을 출력하면

1
2
3
4
5
6
7
8
9
10
11
12
13
select e.employee_id, e.last_name, e.hire_date, d.department_name, j.job_title
from employees e
join departments d
on e.department_id = d.department_id
join jobs j
on e.job_id = j.job_id
where e.hire_date between '01/01/2005' and '05/31/2005';
 
select e.employee_id, e.last_name, e.hire_date, d.department_name, j.job_title
from employees e, departments d, jobs j
where e.department_id = d.department_id 
and e.job_id = j.job_id
and e.hire_date between '01/01/2005' and '05/31/2005';
cs


다음의 두 예제는 3개의 테이블을 조인을 한 예시이다. 또한 두 구문의 결과가 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT *
FROM EMPLOYEES E, DEPARTMENTS D, LOCATIONS L
WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID
AND D.LOCATION_ID = L.LOCATION_ID;
 
 
SELECT *
FROM EMPLOYEES E
JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
JOIN LOCATIONS L
ON D.LOCATION_ID = L.LOCATION_ID;
--실수를 방지할때는 이게 더 좋다.
cs


다음의 예제는 네개이상의 조인을 한 예시이다. 또한 두 구문의 결과가 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
select d.department_name, l.city, c.country_name, r.region_name
from departments d
join locations l
on d.location_id = l.location_id
join countries c
on l.country_id  = c.country_id
join regions r
on c.region_id = r.region_id;
 
select d.department_name, l.city, c.country_name, r.region_name
from departments d, locations l, countries c, regions r
where d.location_id = l.location_id
and l.country_id = c.country_id
and c.region_id = r.region_id;
cs


inner join은 정보가 없으면 표시하지 않는다.


Non-Equi Join

Non-Equi Join은 JOIN조건을 = 연산자 이외의 비교 연산자를 사용하는 것을 말한다.

여기서 JOIN조건을 =연산자를 사용하는 것은 Equi Join이다.



다음 예시를 참고하자.

1
2
3
4
5
select e.last_name, e.salary, s.grade, s.lowsal, s.highsal
from employees e, salgrades s
where e.salary >= s.lowsal 
and e.salary <= s.highsal
order by s.grade desc;;
cs



SQL을 배운지 얼마 되지 않아 잘못된 내용이 있을 수 있습니다. 틀린 내용이있다면, 댓글로 달아주세요.


'DATABASE(oracleDB 11g) > SQL' 카테고리의 다른 글

[SQL]집합연산자의 기초  (0) 2019.01.30
[SQL]INNER JOIN과 OUTER JOIN, SELF JOIN, CROSS JOIN 에 대하여  (0) 2019.01.30
[SQL] 분석 함수  (0) 2019.01.29
[SQL]GROUP BY의 기초  (0) 2019.01.29
[SQL]집합 함수의 기초  (0) 2019.01.29