본문 바로가기

Developer/KH학원

Join 수업정리_2021-01-28

Join

---------------------------------------
--join
---------------------------------------
select D.dept_title
from employy E join department D
    on E.dept_code = D.dept_id

--join종류
--1.EQUI-JOIN 동등비교조건(=)에 의한 JOIN
--2.NON-EQUI JOIN 동등비교조건이 아닌 (beetween and, in, not, in, !=)조인
  
--join문법
--1. ANSI 표준문법 : 모든 DBNS공통문법
--2. Vendor별 문법 : DBMS별로 지원하는 문법. 오라클전용문법

--equi-join 종류
/*
1.inner join 교집합

2.outer join 합집합 좌측테이블기준 합집합
    - left outer join
    - right join
    - full join 

3. cross join
    - 두 테입블간의 조인할 수 있는 모든 경우의 수 표현
    
4. self join 
    - 같은 테이블의 조인
    
5. multiple join
    - 3개 이상의 테이블을 
*/

---------------------------------------------------
--inner join
---------------------------------------------------
--A (inner) join B
--교집합 
--1.기준컬럼값이 null인 경우,집합결과에서 제외 
--2.기준컬럼값이 상대테이블이 존재하지 않는 경우, 결과집합에서 제외

select count(*)
from employee E join department D
     on E.dept_code = D.dept_id;

--1.employee에서 dept_code가 null인 행 제외 : 인턴사원 2행 제외 
--2.department에서 dept_id가 D3, D4, D7인 행은 제외 
select distinct D.dept_id
from employee E join department D
     on E.dept_code = D.dept_id;
--22

select *
from employee E join job J
    on E.job_code = J.job_code;
    
---------------------------------------------------
--outer join 
---------------------------------------------------
--1.left(outer)join
--좌측테이블 기준
--좌측테이블 모든 행이 포함, 우측테이블에는 on조건절에 만족하는 행만 포함

select*
from employee E left outer join department D
    on E.dept_code = D.dept_id;

--2.right(outer)join
--우측테이블 기준
--우측테이블 모든 행이 포함, 좌특테이블에는 on 조건절에 만족하는 행만 포함. 

select*
from employee E right join department D
    on E.dept_code = D.dept_id;


--3.full(outer)join (잘안씀)
--완전 조인
--좌우 테이블 모두 포함

select *
from employee E full join department D
    on E.dept_code = D.dept_id;

select * from employee;
select * from department;

--사원명/부서명 조회시 
--부서지정이 안된사원은 제외 : inner join
--부서지정이 안된사원도 포함 : left join 
--사원배정이 안된 부서도 포함 : right join 

---------------------------------------------------
--CROSS JOIN  
---------------------------------------------------
--상호조인.
--on조건절 없이, 좌측테이블 행과 우측테이블의 행이 연결될 수 있는
--모든 경우의 수를 포함한 결과집합.
--Cartesian's Product

select*
from employee E cross join department D;

--일반컬럼, 그룹함수결과를 함께 조회
select trunc(avg(salary))
from employee;

--모든행하고 붙이기 
select emp_name, 
        salary, 
        avg,
        salary - avg diff
from employee E cross join (select trunc(avg(salary)) avg
                            from employee) A;


---------------------------------------------------
--테이블 별칭
select emp_name,
        employee.job_code,--양쪽에 다 있기때문에(colm동일시) error : ORA-00918: column ambiguously defined
        job_name
from employee join job
    on employee.job_code = job.job_code;

--간결하게
select emp_name,
        employee.job_code,
        job_name
from employee join job
    on employee.job_code = job.job_code;

--기준컬럼명이 좌우테이블에 동일하면 , on 대신 using 사용가능
--using을 사용한 경우에는 별칭을 사용할 수 없다 
--error : column part of USING clause cannot have qualifier
select E.job_code,
        job_code, --별칭을 사용할 수없다.
        J.job_name
from employee E join job J
    using(job_code);--맨 앞으로 빼내고 한번만 표시 

--간결하게 하기위해서 별칭을 써라 ('E'.job_code)

select*from employee;
select * from job;

Cross Join 
Multiple Join 

 

---------------------------------------------------
--SELF JOIN
---------------------------------------------------
--같은 테이블을 좌/우측 테이블로 사용.
--사번, 사원명, 관리자사번, 관리자명 조회 
--self join에서 E1,별칭은 무조건 필요 

select E1.emp_id,
       E1.emp_name, 
       E1.manager_id,
----------------------
       E2.emp_id, 
       E2.emp_name
from employee E1 join employee E2
    on E1.manager_id = E2.emp_id

select*
from employee

---------------------------------------------------
--multiple join 
---------------------------------------------------
--한번에 좌우 두 테이블씩 조인하여 3개이사의 테이블을 연결함.
--사원명, 부서명, 지역명 

select*from employee; --E.dept_code
select*from department; --D.location_id  
select*from location; --L.local_code

select E.emp_name,
        D.dept_title,
        l.local_name
from employee E
    join department D --인턴조회 left
        on E.dept_code = D.dept_id 
    join location L
        on D.location_id = L.local_code;
--where E.emp_name = '송종기';
--조인하는 순서를 잘 고려할것.

 

'Developer > KH학원' 카테고리의 다른 글

Final team Project 진행과정 (05/18)  (0) 2021.05.18
subquery 수업정리_2021-02-05  (0) 2021.02.05
constraint 수업정리_2021-02-04  (0) 2021.02.04
sub-query수업정리_2021-02-02  (0) 2021.02.02
union 수업정리_2021-02-01  (0) 2021.02.01