2 ๋ถ„ ์†Œ์š”

๐Ÿ“š 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;
  • ๊ฐ ๋ถ€์„œ๋ณ„ ์ตœ๊ณ  ๊ธ‰์—ฌ๋ฅผ ๋ฐ›๋Š” ์‚ฌ์›์˜ ๋ถ€์„œ๋ฒˆํ˜ธ, ์‚ฌ๋ฒˆ, ์ด๋ฆ„, ๊ธ‰์—ฌ

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 col_name1
from table_name1

set ์—ฐ์‚ฐ์ž

select col_name2
from table_name2

UNION

๋‘ ์ฟผ๋ฆฌ์—์„œ ์„ ํƒ๋œ ๋ชจ๋“  ํ–‰ ๋ฐ˜ํ™˜ ( ์ค‘๋ณต์€ ํ•œ๋ฒˆ๋งŒ )
ํ•ฉ์ง‘ํ•ฉ

UNION ALL

๋‘ ์ฟผ๋ฆฌ์—์„œ ์„ ํƒ๋œ ๋ชจ๋“  ํ–‰ ๋ฐ˜ํ™˜ ( ๋ชจ๋“  ์ค‘๋ณต ํฌํ•จ )
ํ•ฉ์ง‘ํ•ฉ

INTERSECT

๋‘ ์ฟผ๋ฆฌ์—์„œ ์„ ํƒ๋œ ๋ชจ๋“  ์ค‘๋ณต ํ–‰ ๋ฐ˜ํ™˜
๊ต์ง‘ํ•ฉ

MINUS

ํ•˜๋‚˜์˜ ์ฟผ๋ฆฌ์—์„œ ๋‹ค๋ฅธ ํ•˜๋‚˜์˜ ์ฟผ๋ฆฌ๋ฅผ ์ œ๊ฑฐ. ์ฒซ๋ฒˆ์งธ ์ฟผ๋ฆฌ์—๋งŒ ์žˆ๋Š” ๋‚ด์šฉ์„ ์ถœ๋ ฅ
์ฐจ์ง‘ํ•ฉ

DATABASE Group by ๋งˆ๋ฌด๋ฆฌ

SQL ๋ฌธ์—์„œ์˜ Group by ์ ˆ์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•ด ๋ณด์•˜๋‹ค.
๊ทธ๋ฃน์„ ๋งŒ๋“ค๊ณ  HAVING ์ ˆ๋กœ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค.
๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋”ฐ๋ผ ๊ทธ๋ฃนํ™” ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ž˜ ํŒŒ์•…ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์—ฐ์‚ฐ์ž๋„ ์“ฐ์ผ ๋•Œ๊ฐ€ ์ข…์ข… ์žˆ์œผ๋‹ˆ ์ž˜ ์•Œ๊ณ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.