Written by
최태열
on
on
Oracle DB 4
Join
Join
다수의 table간에 공통된 데이터를 기준으로 검색하는 명령어
- 동등 조인
-- dept table의 부서위치
select ename, empno, loc
from emp, dept
where ename='SMITH' and emp.deptno=dept.deptno;
-- 동일한 column이 중복됨
select *
from emp, dept;
-- 중복되지 않으려면 따로 지정해줘야함
select ename, emp.deptno, dname
from emp, dept
where ename='SMITH' and emp.deptno=dept.deptno;
-- 다른 table로 group을 만들 수 있다.
-- dname으로 그룹을 만들고 ename으로 카운팅해서 정렬했다.
select dname
from emp, dept
where hiredate > '81/04/01' and emp.deptno=dept.deptno
group by dname
order by count(ename) desc
-- join을 활용해 문제를 푸는 단계별 방식
/*
subquery : select절 내부에 select절
inline : from 절에 select 문장의 결과를 동적으로 적용하는 기술
*/
select hiredate from emp;
select hiredate from emp where hiredate > '81/04/01';
select deptno, hiredate from emp
where hiredate in (select hiredate from emp where hiredate > '81/04/01');
select deptno from emp
where hiredate in (select hiredate from emp where hiredate > '81/04/01');
-- group by 절 사용 : 집계함수 사용시
select deptno, count(deptno) from emp
where hiredate in (select hiredate from emp where hiredate > '81/04/01')
group by deptno;
-- inline 방식의 subquery 사용
select deptno, count
from (select deptno, count(deptno) as count
from emp
where hiredate in (select hiredate from emp where hiredate > '81/04/01')
group by deptno);
-- 부서별 최대값 보유한 count값만 출력
select max(count)
from (select deptno, count(deptno) as count
from emp
where hiredate in (select hiredate from emp where hiredate > '81/04/01')
group by deptno);
- not-equl 조인
-- 겹치는게 없는 상태지만 저런 식으로 조인을 한다.
select ename, sal, grade
from emp, salgrade
where sal between losal and hisal;
- self 조인
/*
self 조인 : 하나의 table에서 조인하는 상황을 의미
table은 하나이나 논리적으로 여러개인듯 하게 연출해야 하는 상황에 사용
table 안에서 서로 연관되어 있는 상황
*/
-- SMITH 직원의 메니저 이름 검색
select m.ename
from emp e, emp m
where e.ename='SMITH' and e.mgr=m.empno;
- outer join
-- 모든 사원명, 메니저 명 검색, 단 메니저가 없는 사원도 검색되어야 함
/*
king은 president이기 때문에 매니저가 없다. mgr
없는 쪽에 +를 하면 채워준다.
*/
select e.ename, m.ename
from emp e, emp m
where e.mgr=m.empno(+);
-- 모든 직원명(ename), 부서번호(deptno), 부서명(dname) 검색
-- emp 쪽에 40번 부서가 없기 때문에 +로 채워줌
select ename, dept.deptno, dname
from emp, dept
where emp.deptno(+)=dept.deptno;
--직원들의 이름(first_name), 입사일, 부서명(department_name) 검색하기
-- table 확인
select * from tab;
-- 직원 테이블 확인
desc employees;
-- department_id 확인하고 departments 테이블 확인
desc departments;
-- 초기 답안
select first_name, hire_date, department_name
from employees, departments
where employees.department_id = departments.department_id;
-- 전체 직원수와 비교
select count(*) from employees;
-- departments 에 없는 id 혹은 null인 직원이 존재
select first_name, hire_date, department_name
from employees, departments
where employees.department_id = departments.department_id(+);
Discussion and feedback