---------------------------------------
--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;
---------------------------------------------------
--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 |