[Oracle DB] ์ง๊ณํจ์ | Join
- -
์ง๊ณํจ์๋?
์ฌ๋ฌ ํ ๋๋ ํ ์ด๋ธ ์ ์ฒด ํ์ผ๋ก๋ถํฐ ํ๋์ ๊ฒฐ๊ด๊ฐ์ ๋ฐํํ๋ ํจ์์ด๋ค.
|
MAX์ MINํจ์์์๋ ๋ฌธ์์์๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
Why???!!! ์์คํค์ฝ๋๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
SUM ํจ์
๋จ์ผํ ํจ์ : null์ด ํ๋๋ผ๋ ์์ผ๋ฉด ๊ฒฐ๊ณผ๊ฐ์ด ๋ค null์ด ๋๋ค. ์ฌ๋ฌํ ํจ์ : ํ ์งํฉ๋น ํ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๊ฒ์ผ๋ก, null๊ฐ์ด ์์ผ๋ฉด ์ ์ธ๋์ด ๊ฒฐ๊ณผ๊ฐ์ด ์ถ๋ ฅ๋๋ค. |
๋ฐ๋ผ์ ์๋๋ ์ฌ๋ฌํ ํจ์์ด๋ฏ๋ก, NULL๊ฐ์ด ์ ์ธ๋์ด ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋๋ค.
select sum(sal),sum(comm)
from emp;
COUNT ํจ์ & MIN ํจ์
์์์ ๋งํ๋ฏ์ด, MINํจ์๋ ๋ฌธ์๋ ๊ฐ๋ฅํ๋ค.
๋ํ์ ์ธ ์๋ก, ์๋์ ๊ฐ๋ค.
select count(*), count(comm), min(ename), min(sal)
from emp;
-- ์ง๊ณ ํจ์ ์ฌ์ฉ
์ค๋ณต ์ ๊ฑฐ ( distinct )
distinct๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๋ณต์ ์ ๊ฑฐํ์ฌ, ์ถ๋ ฅํด์ค๋ค.
select distinct job from emp;
์กฐ์ธ ( join )
1. ๊ต์ฐจ์กฐ์ธ ( cross join )
2. ๋ด๋ถ์กฐ์ธ ( inner join ) : theta [non-]equi,natural
3. ์ธ๋ถ์กฐ์ธ( outer join ) : [ left | right | full ] [outer] join
4. ์ ํ์กฐ์ธ( self join )
์์
์๋ ์ค๊ณํ๋ฅผ ์ฐธ๊ณ ํ์ฌ, ์งํ๋ ์์ ์ด๋ค.
1. ์ฐ๋ฆฌ ํ์ฌ์ ๋ถ์๊ฐ ๋ช๊ฐ์ผ??
select count(deptno) from dept;
์ ์์ค์์ deptno ๋์ *์ ์ฐ๋ฉด, ์ ์ฒด๋ฅผ ์ถ๋ ฅํด์ค๋ค.
2. ์ฌ์์ด ํ์ฌ ์์๋์ด ์๋ ๋ถ์๋ ๋ช๊ฐ์ผ??
select count(distinct deptno) from emp;
3. ๋ถ์๋ณ๋ก ์ฌ์์ sal์ด ๋ฎ์ ์์ผ๋ก deptno,dname,empno,ename,sal์ ์ถ๋ ฅํด๋ผ.
select b.deptno,b.dname,a.empno,a.ename,a.sal
from emp a join dept b
on a.deptno=b.deptno order by 1,5 asc;
empํ ์ด๋ธ์ ๋ณ์นญ์ a, dept๋ b๋ก ์นญํ์๋ค.
์ฐธ๊ณ ๋ก ์ค๋ฆ์ฐจ์์ asc, ๋ด๋ฆผ์ฐจ์์ desc์ด๋ฉฐ, default๋ asc์ด๋ค.
4. ๋ถ์๋ณ ์ฌ์์ด ๋ช๋ช ์ธ์ง deptno,dname๋ถ์๋ณ ์ธ์์๋ฅผ ์ถ๋ ฅํด๋ผ.
select a.deptno, b.dname, count(*) as "๋ถ์๋ณ ์ธ์ ์"
from emp a join dept b on a.deptno=b.deptno group by a.deptno, b.dname;
--์ฌ๋์ ์๋ฅผ ๋ฝ์ ๋๋ empํ
์ด๋ธ์์ ๋ฝ์์ผํจ
4-1. ๋ถ์๋ณ ์ฌ์์ด ๋ช๋ช ์ธ์ง depno,dname,๋ถ์๋ณ ์ธ์ ์๋ฅผ ์ถ๋ ฅํ๋, 5๋ช ์ด์์ธ ๋ถ์๋ง ๋ถ์๋ณ ์ธ์์ ๋์ ์์ผ๋ก ์ถ๋ ฅํด๋ผ.
select a.deptno, b.dname, count(*) as "๋ถ์๋ณ ์ธ์ ์"
from emp a join dept b on a.deptno=b.deptno
group by a.deptno, b.dname
having count(*) >= 5
order by 3 desc;
4-2. ๋ถ์๋ณ ์ฌ์์ด ๋ช๋ช ์ธ์ง 30๋ฒ ์ด์์ธ ๋ถ์๋ฒํธ๋ง์ผ๋ก ๋ถ์๋ณ ์ธ์์ ๋์ ์์ผ๋ก ์ถ๋ ฅํด๋ผ.
select a.deptno, b.dname, count(*) as "๋ถ์๋ณ ์ธ์ ์"
from emp a join dept b on a.deptno=b.deptno
where a.deptno >= 30
group by a.deptno, b.dname
having count(*) >= 5
order by 3 desc;
์๋ ์ฝ๋๋ ์์ ๊ฐ์ ์๋ฏธ์ด๋ค.
์๋์ ๊ฐ์ด, where์ ์ ์๋ ๊ฒ์ having์ ์์ฑํด์ฃผ์๋ค.
select a.deptno, b.dname, count(*) as "๋ถ์๋ณ ์ธ์ ์"
from emp a join dept b on a.deptno=b.deptno
--where a.deptno >= 30
group by a.deptno, b.dname
having a.deptno >= 30 and count(*) >= 5
order by 3 desc;
โป ์ฐธ๊ณ ์ด๋ ํ ๊ฐ์ ์ถ๋ ฅํ ๋, ๊ธฐ๋ณธ์ ์ธ ํ์์ ๊ฐ๋ค. select ~from where ( where์ ๊ฐ๋ณ์ ์ธ ์กฐ๊ฑด๋ง ์จ์ผ๋จ ) group by ~~~~ having (๊ทธ๋ฃน์ ๋ํ ์กฐ๊ฑด) order by ; ์ฌ๊ธฐ์ where์ ๊ณผ having์ ๋ํ ์ฐจ์ด์ ์ ๋ํด์ ์์๋ณด์. where์ ์์๋ ๊ฐ๋ณ์ ์ธ ์กฐ๊ฑด๋ง ์ฌ์ฉ๋๋ฉฐ, having์์๋ ๊ทธ๋ฃน์ ๋ํ ์กฐ๊ฑด์ ์์ฑํ๋ค. |
4-4. ๋ถ์๋ณ ์ฌ์์ด ๋ช๋ช ์ธ์ง job์ด 'President'์ธ ์ฌ์์ ์ ์ธํ๊ณ deptno, dname, ๋ถ์๋ณ ์ธ์์๋ฅผ ์ถ๋ ฅํ๋ 5๋ช ์ด์์ธ ๋ถ์๋ง ๋ถ์๋ณ ์ธ์์ ๋์ ์์ผ๋ก ์ถ๋ ฅํด๋ผ.
์ง๊ณํจ์์ ๊ฐ์ด ์ฐ๋ select list์ ์๋ ๋๋จธ์ง ์ปฌ๋ผ์ ๋ฐ๋์ group by์ ์์ผ ํ๋ค.
์ค๋ผํด์์ ๊ฐ์ง ์๋ค๋ ์๋ฏธ์ ๊ธฐํธ๋ != ๋ ๋๊ณ , <> ๋ ๊ฐ๋ฅํ๋ค.
select a.deptno, b.dname, count(*) as "๋ถ์๋ณ ์ธ์ ์"
from emp a join dept b on a.deptno=b.deptno
where job != 'PRESIDENT'
group by a.deptno, b.dname
having count(*)>=5
order by 3 desc;
ํด๋น ๋ฌธ์ ์์๋ ๋ถ์๋ณ๋ก ๋ค๋ฅด๊ธฐ ๋๋ฌธ์, where์กฐ๊ฑด๋ฌธ์ having์ ๋ฃ์ผ๋ฉด ์๋๋ค.
5. ๋ถ์๋ณ๋ก ๊ฐ job๋ณ ์ธ์์ด ๋ช๋ช ์ธ์ง๋ฅผ deptno, dname, job, ์ธ์์๋ฅผ ๋ถ์๋ณ job๋ณ๋ก ์ ๋ ฌํ์ฌ ์ถ๋ ฅํด๋ผ.
select b.deptno,a.dname,b.job, count(*) as "์ธ์์"
from dept a join emp b on a.deptno=b.deptno
group by b.job, b.deptno, a.dname
order by 1,3;
6. ์๋ ์ฌ์ง๊ณผ ๊ฐ์ด, ์ถ๋ ฅํด๋ผ.
select deptno, count(decode(job,'CLERK',0)) as CLERK,
count(decode(job,'MANAGER',0)) as MANAGER,
count(decode(job,'PRESIDENT',0)) as PRESIDENT,
count(decode(job,'ANALYST',0)) as ANALYST,
count(decode(job,'SALESMAN',0)) as SALESMAN
from emp group by deptno order by 1;
7. emp์ sal์ด salgrade์ ์ด๋ค grade์ ํด๋น๋๋์ง ename, job, sal, grade๋ฅผ job๋ณ๋ก sal ๋์ ์์ผ๋ก ์ถ๋ ฅํด๋ผ.
select e.ename, e.job, e.sal, s.grade
from emp e join salgrade s
on e.sal>=s.losal and e.sal<=hisal
order by 2,3 desc;
์ ์กฐ๊ฑด๋ฌธ์ between์ผ๋ก ๋ฐ๊ฟ ์ฌ์ฉ๋ ๊ฐ๋ฅํ๋ค.
select e.ename, e.job, e.sal, s.grade
from emp e join salgrade s
--on e.sal>=s.losal and e.sal<=hisal
on e.sal between s.losal and s.hisal
order by 2,3 desc;
7-1. emp์ sal์ด salgrade์ ์ด๋ค grade์ ํด๋น๋๋์ง ename, job, sal, grade, deptno, dname์ job๋ณ๋ก sal ๋์ ์์ผ๋ก ์ถ๋ ฅ
์ด์ค join์ ๋ํ ๋ฌธ์ ๋ก, ์๋์ ๊ฐ๋ค.
select e.ename, e.job, e.sal, s.grade,d.deptno, d.dname
from emp e join dept d on e.deptno=d.deptno
join salgrade s on e.sal between s.losal and s.hisal
order by 2,3 desc;
์๋๋ ์์ ๊ฐ์ ์ฟผ๋ฆฌ์ ์๋ฏธ๋ก, join์ ์์น๋ง ๋ฐ๊ฟ์ ์์ฑํ ๊ฒ์ด๋ค.
select e.ename, e.job, e.sal, s.grade,d.deptno, d.dname
from salgrade s join emp e on e.sal between s.losal and s.hisal
join dept d on e.deptno=d.deptno
order by 2,3 desc;
์ฌ๊ธฐ๊น์ง๊ฐ inner ์กฐ์ธ์ ๋ํ ์์ ์ด๋ค.
์ฌ๊ธฐ์ ๋ถํฐ๋ outer์กฐ์ธ์ ๋ํ ์์ ์ด๋ค.
7-2. ๋ชจ๋ ๋ถ์์ ๋ํ์ฌ emp์ sal์ด salgrade์ ์ด๋ค grade์ ํด๋น๋๋์งdeptno,dname,ename,job,sal,grade์ ๋ถ์๋ณ๋ก job๋ณ๋ก sal ๋์ ์์ผ๋ก ์ถ๋ ฅํด๋ผ.
select d.deptno, d.dname, e.ename, e.job, e.sal, s.grade
from emp e right outer join dept d on e.deptno=d.deptno
left outer join salgrade s on e.sal between s.losal and s.hisal
order by 1,4,5 desc;
์๋๋ left, right, full์ join์ ๋ํ ์ฌ์ง์ด๋ค.
์ดํดํ๋๋ฐ, ์ข์ ์ฌ์ง์ด๋ผ์ ๊ฐ์ ธ์๋ค.^_^
์ฐธ๊ณ ์ฃผ์ : https://haenny.tistory.com/34
7-3. ๋ชจ๋ ๋ถ์์ ๋ํ์ฌ emp์ sal์ด salgrade์ ์ด๋ค grade์ ํด๋น๋๋์ง deptno,dname,ename,job,sal,grade์ ๋ถ์๋ณ๋ก job๋ณ๋ก sal ๋์ ์์ผ๋ก ์ถ๋ ฅํด๋ผ.(๋จ, sal emp dept์์ผ๋ก ์กฐ์ธ)
select d.deptno, d.dname, e.ename, e.job, e.sal, s.grade
from salgrade s
join emp e on e.sal between s.losal and s.hisal
right join dept d on e.deptno=d.deptno
order by 1,4,5 desc;
8. ๋ชจ๋ ๋ถ์์ ๋ํ์ฌ sal์ ํฉ๊ณ๊ฐ 1000000์ด์์ด๋ฉด 'good' , 5000์ด์์ด๋ฉด 'average' , 1์ด์ 5000๋ฏธ๋ง์ด๋ฉด 'bad' , 0์ด๋ฉด 'nopay' , ์์ผ๋ฉด 'not exists'๋ก ํ๊ฐํ๋ deptno,dname, ๋ถ์๋ณ sal์ ํฉ๊ณ, ํ๊ฐ๋ฅผ ์ถ๋ ฅํด๋ผ.
select d.deptno,d.dname, sum(e.sal) as "sal ํฉ๊ณ",
case
when sum(e.sal)>= 1000000 then 'good'
when sum(e.sal)>= 5000 then 'average'
when sum(e.sal) between 1 and 5000 then 'bad'
when sum(e.sal) = 0 then 'no pay'
when sum(e.sal) is null then 'not exists'
end as ํ๊ฐ
from dept d left outer join emp e on e.deptno=d.deptno
group by d.deptno,d.dname
order by 1;
9. ๋ชจ๋ ๋ถ์์ ๋ํ์ฌ emp์ sal+sal*comm์ด salgrade์ ์ด๋ค grade์ ํด๋น๋๋์ง deptno, dname, ename, job, sal, sal+sal*comm, grade๋ฅผ ์ถ๋ ฅํ๋, ์๋ grade๋ '***'๋ก ํ์ํ๊ณ ๋ถ์๋ณ๋ก job๋ณ๋ก sal ์ด ๋์ ์์ผ๋ก ์ถ๋ ฅํด๋ผ.
select d.deptno,d.dname,e.ename,
e.job,e.sal,e.sal+e.sal*nvl(e.comm,0)as ํฉ,nvl(to_char(s.grade),'****') as ๋ฑ๊ธ
from dept d left outer join emp e on d.deptno = e.deptno
left outer join salgrade s on e.sal+e.sal*nvl(e.comm,0) between s.losal and s.hisal
order by 1,4 desc;
์ฌ๊ธฐ์๋ถํฐ๋ ๊ต์ฐจ์กฐ์ธ์ด๋ค.
์๋๋ ๋ฐ๋ก ์์ ex3๊ณผ ๊ฐ์ ์์ ์ด๋ค.
select b.deptno,b.dname,a.empno,a.ename,a.sal from emp a, dept b
๊ฒฐ๊ณผ๊ฐ์ด ๋๋ฌด ๊ธธ์ด, ์ผ๋ถ๋ง ์บก์ณํ ๊ฒฐ๊ณผ์ด๋ค.
์ด์ฒ๋ผ ํ์ํ ์กฐ๊ฑด์ ์ ์ฃผ๋ฉด, ๋ฌด์์ ์กฐ์ธ์ด ๋์ด๋ฒ๋ฆฐ๋ค๋ ๋ฌธ์ ์ ์ ์์๋์.
'IT & Security > DB' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋น์ ์ด ์ข์ํ ๋งํ ์ฝํ ์ธ
-
[Oracle] ํ๋ก์์ | ์ฌ์ฉ์ ์ ์ํจ์ | ํจ์ ๋ง๋ค๊ธฐ 2021.05.12
-
[DB] ์ค๋ผํด ์๋ธ์ฟผ๋ฆฌ ์์ 2021.04.13
-
[ Oracle DB ] ํจ์ | ๋ด์ฅํจ์ | ์ง๊ณํจ์ | ๋จ์ผํ ํจ์ | ๋ณํํจ์ | ์ฌ์ฉ์ ์ ์ ํจ์ 2021.03.10
-
[ Oracle DB] scott ์คํค๋ง ์ค์นํ๊ธฐ, ์ ์ฝ ์กฐ๊ฑด ์ค์ ํ๊ธฐ ,์ ์ฝ์กฐ๊ฑด ์คํค๋ง , ์ ์ฝ ์กฐ๊ฑด ํ์ธํ๊ธฐ 2021.03.10
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค