본문 바로가기

Data/Data Analysis

[SQL] Group by 명령어

반응형



[참조]: http://runtoyourdream.tistory.com/83

SELECT department_id, SUM(salary) FROM hr.employees GROUP BY department_id


라는 명령어가 있을때 이 구문의 뜻은:

"hr 스키마가 가지고 있는 employees 테이블로부터 부서 아이디를 기준으로 싸그리 묶어서 각 부서별 월급의 합계를 알고싶다."


DEPARTMENT_ID

SUM(SALARY) 

 100

51600 

 30

24900 

 20

19000 

 70

10000 

 90

58000 


이렇게 department_id 로 묶인 테이블이 나오게 된다.


만약에 GROUP BY를 안썻을 경우에는 해보진 않았지만 아마 department_id가 중복되는 row가 생길꺼같다.


또한 조건문을 걸고 테이블을 뽑을수가 있는데 예를들어:

"월급의 합계를 보고싶은데, 그합계가 10000이상인 그룹들만 보고 싶다" 라고 할때


SELECT department_id, SUM(salary) FROM hr.employees GROUP BY department_id HAVING SUM(salary) > 10000;


또는


SELECT department_id, SUM(salary) FROM hr.employees GROUP BY 1 HAVING SUM(salary) > 10000;

굳이 department_id라 표시하지않고 1,2,3 이런식으로 표시를 할 수가 있다.


라는 명령어를 쓸 수가 있다.


여기서 의아하게 생각할 수 있는 부분이 있는데: "왜 WHERE구문을 안쓰고 HAVING을 쓰는거지?"

라는 질문이 나올 수 가 있다.


이유는 SQL구문의 우선순위 때문이다.


SQL구문의 우선순위는 다음과 같다.

SELECT

FROM

WHERE --1

GROUP BY --2

HAVING --3

ORDER BY --4;


WHERE가 HAVING보다 우선순위가 높다.


따라서 WHERE을 쓸경우에는 GROUP BY를 진행하기전에 조건문을 걸게 되면서

정상적으로 원하는 결과를 얻을 수가 없게 된다.

(즉, WHERE 명령어를 실행하고 -> GROUP BY명령어 실행 과 GROUP BY 명령어를 실행 -> HAVING 명령어 실행 의 차이점이다)


따라서 GROUP BY를 사용하고 조건문을 걸고 싶을때는 HAVING 명령어를 사용해야한다.

반응형