DATABASE_Group by ์
๐ DB ( DataBase )
๐ Group by ์
Group by ์ ์ด๋ ๋ฌด์์ธ๊ฐ?
- select ๋ฌธ์์ group by ์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ database ๋ ์ฟผ๋ฆฌ ๋ ํ ์ด๋ธ์ ํ์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ๋๋ค.
- database ๋ ์ ํ ๋ชฉ๋ก์ ์ง๊ณ ํจ์๋ฅผ ๊ฐ ํ ๊ทธ๋ฃน์ ์ ์ฉํ๊ณ ๊ฐ ๊ทธ๋ฃน์ ๋ํด ๋จ์ผ ๊ฒฐ๊ณผ ํ์ ๋ฐํํ๋ค.
- group by ์ ์ ์๋ตํ๋ฉด database ๋ ์ ํ ๋ชฉ๋ก์ ์ง๊ณ ํจ์๋ฅผ ์ฟผ๋ฆฌ ๋ ํ ์ด๋ธ์ ๋ชจ๋ ํ์ ์ ์ฉํ๋ค.
- select ์ ์ ๋ชจ๋ ์์๋ group by ์ ์ ํํ์, ์ง๊ณ ํจ์๋ฅผ ํฌํจํ๋ ํํ์ ๋๋ ์์๋ง ๊ฐ๋ฅํ๋ค.
์์
- ๋ถ์๋ฒํธ, ๋ถ์๋ณ ๊ธ์ฌ์ ์ดํฉ, ํ๊ท ๊ธ์ฌ
select department_id, sum(salary), avg(salary)
from employees;
group by department_id;
-> ๋ถ์๋ณ๋ก ๊ตฌํ๊ธฐ ๋๋ฌธ์ ๋ถ์๋ก ๊ทธ๋ฃนํ์ ํด์ค๋ค
- ๊ฐ ๋ถ์๋ณ ์ต๊ณ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์์ ๋ถ์๋ฒํธ, ์ฌ๋ฒ, ์ด๋ฆ, ๊ธ์ฌ
- join ์ฌ์ฉ
select a.department_id, e.employee_id, e.first_name, a.smax
from employees e join (
select department_id, max(salary) as smax
from employees
group by department_id
) a
on e.department_id = a.department_id
and e.salary = a.smax;
- ๊ฐ ๋ถ์๋ณ ์ต๊ณ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์์ ๋ถ์๋ฒํธ, ์ฌ๋ฒ, ์ด๋ฆ, ๊ธ์ฌ
- ๋ค์ค ์ปฌ๋ผ subquery ์ฌ์ฉ
select department_id, employee_id, first_name, salary
from employees
where (department_id, salary) in ( select department_id, max(salary)
from employees
group by department_id )
order by department_id;
Having ์
- group by ํ ๊ฒฐ๊ณผ์ ์กฐ๊ฑด์ ์ถ๊ฐํ ๊ฒฝ์ฐ having ์ ์ ์ฌ์ฉํ๋ค.
- Query์ ์คํ ์์๋ฅผ ๋ณด๋ฉด where ์ ์ด group by ์ ๋ณด๋ค ๋จผ์ ์คํ๋๊ธฐ ๋๋ฌธ์ Aggregate ( sum, avg .. ) ์กฐ๊ฑด์ having ์ ์ ์์ฑํ๋ค.
- ๋ถ์๋ณ ํ๊ท ๊ธ์ฌ๊ฐ 7000์ด์์ธ ๋ถ์ ๋ฒํธ, ํ๊ท ๊ธ์ฌ
select department_id, avg(salary)
from employees
group by department_id
having avg(salary) >= 7000;
- Having ์ ์์ subquery
- ๋ถ์๋ณ ํ๊ท ๊ธ์ฌ๊ฐ 20๋ฒ ๋ถ์์ ํ๊ท ๊ธ์ฌ๋ณด๋ค ํฐ ๋ถ์์ ๋ถ์๋ฒํธ, ํ๊ท ๊ธ์ฌ
select department_id, avg(salary)
from employees
group by department_id
having avg(salary) > (
select avg(salary)
from employees
where department_id = 20
);
-> subquery์์ ํ๊ท ํ๋๋ง ๊ตฌํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ group by๋ฅผ ํด์ค ํ์๊ฐ ์๋ค
SET ( ์งํฉ ์ฐ์ฐ์ )
- ๋ชจ๋ ์งํฉ ์ฐ์ฐ์๋ ๋์ผํ ์ฐ์ ์์๋ฅผ ๊ฐ๋๋ค.
- select ์ ์ ์๋ column ๊ฐ์์ type์ด ์ผ์นํด์ผ ํ๋ค.
select col_name1
from table_name1
set ์ฐ์ฐ์
select col_name2
from table_name2
UNION
๋ ์ฟผ๋ฆฌ์์ ์ ํ๋ ๋ชจ๋ ํ ๋ฐํ ( ์ค๋ณต์ ํ๋ฒ๋ง )
ํฉ์งํฉ
UNION ALL
๋ ์ฟผ๋ฆฌ์์ ์ ํ๋ ๋ชจ๋ ํ ๋ฐํ ( ๋ชจ๋ ์ค๋ณต ํฌํจ )
ํฉ์งํฉ
INTERSECT
๋ ์ฟผ๋ฆฌ์์ ์ ํ๋ ๋ชจ๋ ์ค๋ณต ํ ๋ฐํ
๊ต์งํฉ
MINUS
ํ๋์ ์ฟผ๋ฆฌ์์ ๋ค๋ฅธ ํ๋์ ์ฟผ๋ฆฌ๋ฅผ ์ ๊ฑฐ. ์ฒซ๋ฒ์งธ ์ฟผ๋ฆฌ์๋ง ์๋ ๋ด์ฉ์ ์ถ๋ ฅ
์ฐจ์งํฉ
DATABASE Group by ๋ง๋ฌด๋ฆฌ
SQL ๋ฌธ์์์ Group by ์ ์ ๋ํด ๊ณต๋ถํด ๋ณด์๋ค.
๊ทธ๋ฃน์ ๋ง๋ค๊ณ HAVING ์ ๋ก ์กฐ๊ฑด์ ์ถ๊ฐํ๋ ๊ตฌ์กฐ์ด๋ค.
๊ฐ์ ธ์ค๊ณ ์ถ์ ๋ฐ์ดํฐ๊ฐ ๋ฌด์์ธ์ง์ ๋ฐ๋ผ ๊ทธ๋ฃนํ ํด์ผํ๋ ๊ฒ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ ํ์
ํด์ ์ฌ์ฉํด์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ฐ์ฐ์๋ ์ฐ์ผ ๋๊ฐ ์ข
์ข
์์ผ๋ ์ ์๊ณ ์์ผ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.