일단 해보는 코딩/Oracle SQL

[오라클/SQL] JOIN - INNER/OUTER/ON

eun_zoey2 2022. 6. 8. 16:31
728x90

JOIN

JOIN은 데이터베이스 내의 여러 테이블에서 가져온 레코드를 조합하여 하나의 테이블이나 결과 집합으로 표현해준다.
이러한 JOIN은 보통 SELECT 문과 함께 자주 사용된다.

종류 설명
(INNER) JOIN 두 테이블에서 값이 일치하는 레코드를 반환
OUTER JOIN 한 테이블있는 데이터 값이 다른 테이블에 하나도 나타나지 않는 경우 OUTER JOIN(외부 조인)를 사용
LEFT (OUTER) JOIN 왼쪽 테이블에서 모든 레코드를 반환하고, 오른쪽 테이블에서 일치하는 레코드를 반환
RIGHT (OUTER) JOIN 오른쪽 테이블에서 모든 레코드를 반환하고, 왼쪽 테이블에서 일치하는 레코드를 반환
FULL (OUTER) JOIN 쪽 또는 오른쪽 테이블의 모든 레코드를 반환
SELF JOIN 하나의 테이블을 Alias 로 구분해서 마치 두 테이블인 것처럼 생성

 



Q. employees 테이블에는 employee_id 가 156과 100인 두명의 last_name이 'King' 인 사용자가 있는데,
이들의 department_name을 출력하시오.

select last_name, department_id, department_name from employees
where department_id in (156,100);
/*  last_name 부적합한 식별자 */

select last_name, department_id, department_name from departments
where department_id in (156,100);
/* department_name 부적합한 식별자 */

select last_name, employee_id, department_name from employees, departments
where last_name = 'King';
/*  신뢰할 수 없다 */

각 종 오류를 확인

select last_name, employee_id, department_name from employees, departments
where last_name = 'King'
AND employees.department_id = departments.department_id

/* Alias,  Cname(Canonical)name */
select e.last_name, e.employee_id, d.department_name from employees e, departments d
where last_name = 'King'
AND e. department_id = d.department_id;

select e.last_name, e.employee_id, d.department_name, e.department_id
from employees e INNER JOIN departments d
ON e.department_id = d.department_id
WHERE last_name = 'King' ;

/* INNER 생략 가능 */
select e.last_name, e.employee_id, d.department_name, e.department_id
from employees e JOIN departments d
ON e.department_id = d.department_id
WHERE last_name = 'King' ;

INNER JOIN 사용

Q. Employees 테이블에서 Executive 부서(department_name)의 각 사원의 last_name과 해당 사원의 부서장을 보이시오.

-- [사진1]좌측에 큰 테이블이 있기때문에 left 함수를 사용 
select employee_id, last_name, TO_CHAR(hire_date, 'yyyy-mm') as hired , department_name
from employees e LEFT OUTER JOIN departments d
ON d.department_id =  e. department_id
where TO_CHAR(hire_date, 'yyyy-mm') BETWEEN '1999-01' AND '1999-06';

-- [사진2]우측에 큰 테이블이 있기 때문에 RIGHT 함수를 사용
select employee_id, last_name, TO_CHAR(hire_date, 'yyyy-mm') as hired , department_name
from departments d RIGHT OUTER JOIN employees e
ON d.department_id =  e. department_id
where TO_CHAR(hire_date, 'yyyy-mm') BETWEEN '1999-01' AND '1999-06';

-- [사진3]select employee_id, last_name, TO_CHAR(hire_date, 'yyyy-mm') as hired , department_name
from employees e JOIN departments d
ON d.department_id(+) =  e. department_id
where TO_CHAR(hire_date, 'yyyy-mm') BETWEEN '1999-01' AND '1999-06';

-- [사진1]
select department_name, a.last_name, b.last_name
from employees a, employees b, departments d
where a.manager_id = b.employee_id
and a.department_id = d.department_id
and d.department_name = 'Executive';

-- [사진2]
select department_name, a.last_name, b.last_name
from employees a JOIN employees b
on a.manager_id = b.employee_id
                 JOIN departments d
on d.department_id = a.department_id
where d.department_name = 'Executive';