2021. 04. 30(금) TIL

Dylan·2021년 4월 30일
0
post-thumbnail

Database

조인

조인의 종류

비등가조인(Non-Equi Join)

  • 조인조건을 지정할 때 조인 대상테이블에서 같은 값을 가진 데이터를 가져오는 대신, 크거나 작은 경우의 조건으로 데이터를 조회하는 조인 방식이 비등가 조인이다.
  • 비등가조인 사용하기
    • customer테이블과 gift테이블을 조인하여 고객별 마일리지 포인트를 조회한 후, 해당 마일리지 점수로 받을 수 있는 상품을 조회하여, 고객이름, 포인트, 받을 수 있는 선물 조회하기
      -- Oracle Join
      SELECT c.gname, c.point, g.gname
      FROM customer c, gift g
      WHERE c.point >= g.g_start AND c.point <= g.g_end;
      
      -- ANSI Join
      SELECT c.gname, c.point, g.gname
      FROM customer c JOIN gift g
      ON c.point >= g.g_start AND c.point <= g.g_end; 
    • student테이블과 score테이블 hakjum테이블을 조인하여 학생이름, 점수, 학점 조회하기
      -- Oracle Join
      SELECT s.name, o.total, h.grade
      FROM student s, score o, hakjum h
      WHERE s.studno = o.studno
      AND o.total >= h.min_point
      AND o.total <= h.max_point;
      
      -- ANSI Join
      SELECT s.name, o.total, h.grade
      FROM student s JOIN score o
      ON s.studno = o.studno
      JOIN hakjum h
      ON o.total >= h.min_point
      AND o.total <= h.max_point;

셀프조인(Self Join)

  • 하나의 테이블을 이용해서 조인을 구성하는 것이다.
  • 하나의 테이블에 안에 상위데이터, 하위데이터가 있는 경우 상위데이터와 하위데이터를 서로 연관지어서 조회할 때 셀프조인이 필요하다.
  • 하나의 테이블을 역할을 각각 나누어서 조인에 참여시켜야 한다
  • 셀프조인 사용하기
    • emp테이블에서 사원이름과 그 사원의 상사이름을 조회하기
      -- Oracle Join
      SELECT 사원.ename, 상사.ename
      FROM emp 사원, emp 상사
      WHERE 사원.mgr = 상사.empno;
      
      -- ANSI Join
      SELECT 사원.enme, 상사.ename
      FROM emp 사원 JOIN emp 상사
      ON 사원.mgr = 상사.empno

-- 비등가조인
-- 모든 사원들의 아이디, 이름, 급여, 급여등급을 조회하기
-- 아이디, 이름, 급여 - employees
-- 급여등급 - salary_grade
-- 사원의 급여가 급여등급정보의 최소급여 이상이고, 최대급여 이하인 행과 조인
select E.employee_id, e.first_name, e.salary, s.grade
from employees E, salary_grade S
where e.salary >= s.min_salary and e.salary <= s.max_salary
order by e.employee_id;

-- 셀프조인(자체조인)
-- 60번 부서에 소속된 사원들의 사원아이디, 사원이름, 상사의 아이디, 상사의 이름 조회
-- 사원아이디, 사원이름 - employees
-- 상사의 아이디, 상사의 이름 - employyes
select E.employee_id emp_id , E.first_name emp_name , M.employee_id mgr_id , M.first_name mgr_name
from employees E, employees M
where E.manager_id = M.employee_id
and e.department_id = 60;

-- 60번 부서에 소속된 사원들의 사원아이디, 사원이름, 사원의 소속부서명, 
--                  상사의 아이디, 상사의 이름, 상사의 소속부서명 조회
-- 사원아이디, 사원이름 - employees
-- 상사의 아이디, 상사의 이름 - employees
-- 사원의 소속부서명 - departments
-- 상사의 소속부서명 - departments
select E.employee_id    emp_id , E.first_name        emp_name, 
       E.department_id  edept_id, ED.department_name edept_name, 
       M.employee_id    mgr_id , M.first_name        mgr_name, 
       M.department_id  mdept_id, MD.department_name mdept_name
from employees E, employees M, departments ED, departments MD
where E.department_id = 60              -- 60번 부서에 소속된 사원.
and E.manager_id = M.employee_id        -- 사원테이블의 manager_id와 상사테이블이ㅡ employee_id 조인
and E.department_id = ED.department_id
and M.department_id = MD.department_id
order by emp_id asc;



0개의 댓글