조인(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; |
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 |