ํ๋ ์ด์์ ํ์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด ์ฐ์ฐํ์ฌ ํ๋์ ๊ฒฐ๊ณผ๋ก ๋ํ๋ธ๋ค. ๊ทธ๋ฃน ํจ์๋ null์ ์ ์ธํ๊ณ ๊ณ์ฐํ๋ค.
count : ํ์ ๊ฐ์๋ฅผ ๋ฐํํ๋ค.
select count(comm) from emp;
-- commition์ ๋ฐ๋ ์ฌ์์ ์ธ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
select count(*) from emp;
-- ์ ์ฒด ์ฌ์์ ์ธ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
sum : ์ปฌ๋ผ ๊ฐ๋ค์ ์ด ํฉ๊ณ๋ฅผ ๊ตฌํ๋ค.
select sum(sal) from emp;
-- ์ ์ฒด ์ฌ์์ ๊ธ์ฌ ํฉ๊ณ๋ฅผ ๊ตฌํ๋ค.
avg : ์ปฌ๋ผ ๊ฐ๋ค์ ํ๊ท ๊ฐ์ ๊ตฌํ๋ค.
select avg(sal) from emp;
-- ์ ์ฒด ์ฌ์์ ๊ธ์ฌ ํ๊ท ์ ๊ตฌํ๋ค.
max : ์ปฌ๋ผ ๊ฐ๋ค์ ๋ํ ์ต๋๊ฐ์ ๊ตฌํ๋ค.
select max(sal) from emp;
-- ์ ์ฒด ์ฌ์์ ๊ธ์ฌ ์ค ๊ฐ์ฅ ๋์ ๊ธ์ฌ ๊ฐ์ ๊ตฌํ๋ค.
min : ์ปฌ๋ผ ๊ฐ๋ค์ ๋ํ ์ต์๊ฐ์ ๊ตฌํ๋ค.
select min(sal) from emp;
-- ์ ์ฒด ์ฌ์์ ๊ธ์ฌ ์ค ๊ฐ์ฅ ๋ฎ์ ๊ธ์ฌ ๊ฐ์ ๊ตฌํ๋ค.
group by
ํน์ ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ์ง๊ณ๋ฅผ ํ ๋ ์ฌ์ฉํ๋ค. ์๋ฅผ ๋ค์ด ๋ถ์๋ณ ์ธ์ ์, ํ๊ธ๋ณ ์ฑ์ ๋ฑ๊ณผ ๊ฐ์ ๊ฒ์ ๊ตฌํ ๋ ์ฌ์ฉํ ์ ์๋ค. group by ๋ค์ ๊ธฐ์ค์ด ๋๋ ์ปฌ๋ผ์ ์ ๋๋ค.
```
select deptno, count(*) from emp group by deptno;
-- ๋ถ์๋ณ ์ธ์ ์๋ฅผ ๊ตฌํ๋ค.
```
๊ทธ๋ฃน ํจ์๋ฅผ ์ธ ๋๋ select ๋ค์ group by ๋ค์ ์ค๋ ์ปฌ๋ผ๋ง์ ์ธ ์ ์๋ค.
select empno, count(*) from emp group by deptno;
-- ์ด๋ ๊ฒ๋ ์ธ ์ ์๋ค. (์ค๋ฅ)
group by๋ก ์ง๊ณ๋ ๊ฐ์ where์ ๊ณผ ๊ฐ์ ์กฐ๊ฑด์ ์ถ๊ฐํด์ผ ํ ๋ ์ฌ์ฉํ๋ค. where์ ์ด ์ ํจํ์ง ์๋ ์ด์ ๋ where์ ์ด group by์ ๋ณด๋ค ๋จผ์ ์คํ๋์ด, where์ ์ ์กฐ๊ฑด์ด group by์ ์ ์ ์ฉ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๐ sql select ์ฟผ๋ฆฌ์ ์คํ ์์
from - on - join - where - group by - cube | rollup - having - select - distinct - order by - top
having์ ์ select ๊ธฐ์ค ์ปฌ๋ผ, ์ฐ์ฐ ๊ฐ from ํ
์ด๋ธ groub by ๊ธฐ์ค ์ปฌ๋ผ having ์กฐ๊ฑด
์ผ๋ก ์์ฑํ๋ค.
-- ์ธ์์ด 5๋ช
์ด์์ธ ๋ถ์๋ฅผ ๋์์ผ๋ก ํ๋ ๋ถ์๋ณ ํ๊ท ๊ธ์ฌ
select deptno, round(avg(sal), 0) from emp group by deptno having count(*) >= 5;
๐ ๋ฌธ์
์ฐ์ต์ ์ฌ์ฉํ emp ํ
์ด๋ธ, dept ํ
์ด๋ธ, salgrade ํ
์ด๋ธ์ ๋ค์๊ณผ ๊ฐ๋ค. (Oracle DB scott ๊ณ์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์กด์ฌํ๋ ํ
์ด๋ธ)
๐ก ๋ต์
select d.deptno, d.dname, nvl(round(avg(sal)), 0) as avg
from emp e right outer join dept d on e.deptno=d.deptno group by d.deptno, d.dname;
select e.job, round(avg(e.sal)) as avg
from emp e inner join dept d on e.deptno=d.deptno
where d.loc='DALLAS' group by e.job;
select s.grade, count(*) as count
from emp e inner join salgrade s on e.sal between s.losal and s.hisal group by s.grade
order by 2 desc;
select e.job, round(avg(s.grade), 1) as avg
from emp e inner join salgrade s on e.sal between s.losal and s.hisal group by e.job
order by 2 asc;
select d.deptno, d.dname, nvl(round(avg(e.sal), 0), 0) as sal, nvl(round(avg(s.grade), 1), 0) as grade
from emp e inner join salgrade s on e.sal between s.losal and s.hisal
right outer join dept d on e.deptno=d.deptno
group by d.deptno, d.dname;
๐ ๊ฐ๋จ ๋ฌธ๋ฒ ์ค๋ช
round(์ปฌ๋ผ, ๋ฐ์ฌ๋ฆผํ ์๋ฆฌ ๊ฐ)
์ฝ๊ฒ ๋งํด ์์์ ๋ช ์๋ฆฌ๊น์ง ์ถ๋ ฅํ ๊ฒ์ธ์ง๋ฅผ ์ ํ ์ ์๋ค. ๋ฐ์ฌ๋ฆผํ ์๋ฆฌ ๊ฐ์ ์์์ ๋ถํฐ ์์๋๋ก(์ค๋ฅธ์ชฝ์ผ๋ก) 0, 1, 2...๋ก ๋งค๊ธด๋ค. ์๋ฅผ ๋ค์ด 0์ ์ ์ผ๋ฉด ์์์ ์๋ ์ฒซ ๋ฒ์งธ ์๋ฆฌ์์ ๋ฐ์ฌ๋ฆผ์ ํ๊ธฐ ๋๋ฌธ์ ์์์ ์์ด ์ ์๋ง ์ถ๋ ฅ๋๋ค. 1์ ์ ์ผ๋ฉด ์์์ ์๋ ์ฒซ ๋ฒ์งธ ์๋ฆฌ๊น์ง ์ถ๋ ฅ๋๋ค.
nvl(์ปฌ๋ผ, null์ผ ๊ฒฝ์ฐ์ ๋ฐํ ๊ฐ)
์ค๋ผํด์์๋ง ์ ๊ณตํ๋ ํจ์์ด๋ค. null ๊ฐ์ ์ง์ ํด ๋์ ๊ฐ์ผ๋ก ์นํํด ์ค๋ค.