[참조]: 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 명령어를 사용해야한다.
'Data > Data Analysis' 카테고리의 다른 글
[Pyspark] DataFrame 조작 명령어 정리 (0) | 2018.12.20 |
---|---|
[SQL] UNION, JOIN명령어 (1) | 2018.12.18 |
[SQL] SELECT 명령어 모음 (0) | 2018.11.26 |
[MariaDB] SQL 명령어 실행 시 주의할점 (0) | 2018.11.26 |
[Pandas] csv 파일안에 list 형식으로 저장되어있을때 불러읽는법 (2) | 2018.11.05 |