개발 공부 기록하기/02. DB & SQL

SQL group by와 having 이해하기

lannstark 2019. 7. 27. 12:20

직원에 대한 테이블 emp가 있다고 하자
emp는 3가지 column을 가지고 있다.

 

id : primary key
dept : 근무 부서 번호
salary : 월급

 

이 테이블 안에는 다음과 같은 데이터들이 있다고 하자

(1, 1, 1000) // 1번 부서에서 1000원을 받고 일하는 사람
(2, 1, 2000)
(3, 1, 3000)
(4, 2, 4000)
(5, 2, 5000)
(6, 3, 6000)
(7, 3, 7000)
(8, 2, 8000)

 

이런 상황에서 내가 근무 부서 당 월급의 총합을 알고 싶다고 하자.

 

group by를 모르는 상황에서는 이렇게 할 수 있다.

 

1. 우선 근무 부서 번호의 종류를 확인한다

SELECT DISTINCT(dept) FROM emp;

2. 그 다음 각 근무 부서 번호에 따라 salaray 합을 구한다

SELECT SUM(salary) FROM emp WHERE dept = 1;
SELECT SUM(salary) FROM emp WHERE dept = 2;
SELECT SUM(salary) FROM emp WHERE dept = 3;

 

 

이런 방식은 큰 단점이 있다.

근무 부서의 종류가 많아지면 많아질 수록 쿼리를 여러 번 날려야 한다. (귀찮고 힘들어진다..) 만약 부서의 종류가 100가지라면..?

group by

이럴 때 활용하는 것이 바로 group by이다.

근무 부서에 따라~ 구분해서 한 번에 보고 싶다면

SELECT dept, SUM(salary) FROM emp GROUP BY dept;

라고 작성하면 된다. 근무 부서끼리 묶어 주라는 뜻이 된다!

 

Q.
그렇다면 만약 근무 부서끼리 묶여 있는 급여의 합이 10000 이상인 데이터만 보고 싶다면?

having

우선 생각 해볼 수 있는 쿼리는 WHERE 문을 활용하는 것이다

SELECT dept, SUM(salary) FROM emp GROUP BY dept WHERE sum(salary) > 10000;

하지만 뭔가 되겠지 하는 예상과는 달리 이 쿼리는 You have an error in your SQL syntax 라는 에러를 내뱉는다.

이럴 때 사용할 수 있는 것이 바로 having이다

SELECT dept, SUM(salary) FROM emp GROUP BY dept HAVING sum(salary) > 10000;

 

having은 GROUP BY와 함께 사용하는 조건의 역할을 한다고 생각하면 쉽다!

 

요약

- group by : ~를 기준으로 sum, avg 등등을 보여줘

- having : group by와 함께 사용할 때 나올 수 있는 조건