관리 메뉴

JIE0025

[MSSQL] GROUP BY, HAVING 이해하기 본문

Application/Database

[MSSQL] GROUP BY, HAVING 이해하기

Kangjieun11 2021. 4. 7. 14:00
728x90

개별 조회 : 행을 각각 조회하는 것

 

집계 조회 : 결과 행들을 그룹 단위로 집계해서 조회하는것

- 여러개의 행이 한개의 그룹으로 묶일 수 있을 떄 묶어서 집계한 결과를 조회함.

- GROUP BY와 HAVING 쿼리 사용.

 

행 각각이 아닌 그룹핑을 하여 조회하는 것이다.

orderid empid
1 1
2 1
3 1

위의 테이블을 보며 이해해보자

위 테이블에 존재하는 행의 개수는 3개이다.

 

다음 명령어를 실행했을 때, 

SELECT empid

FROM Sales.Orders

GROUP BY empid 를 진행하면

결과로 출력되는 행은 1개이다

 

empid로 구분하여 행들을 출력하라는 의미!

 

 

< GROUP BY 첫번째 예제 > 

sales.orders테이블로부터

고객 ID가 71번인 것의 주문 건수(행) 중에 , empid와 orderdate로 그룹핑을하고, 그룹핑된 행에 COUNT(*) 총 주문 건수가 1보다 큰 것들만 조회하라는 이야기이다.

 

쿼리 결과를 쉽게 이해하기 위해 ORDER BY empid 를 함께 조회했다.

 

 

쿼리 결과를 살펴보자

 

행별로 그룹1, 그룹2, 그룹3이다. 

 

- orderID 1,2,3이라는 말은 주문건이 각년도에 1건,2건,3건이라는 뜻이다.

- 고객id 71번이 empid 1번 직원에게 2006년에 1건, 2007년에 2건, 2008년에 3건 주문한것이다.

 

 

HAVING

HAVING 은 GROUP의 필터링 조건을 주는 것이다.

 

GROUP BY 사용시 사용하는 column이 SELECT 절에 그대로 들어가면 상관 없지만,

그룹 바이 요소로 사용하지 않는 column을 select절에 다이렉트로 들어갈 수 없다.

>> 집계함수를 사용해야만 한다. SUM, COUNT, YEAR 등

 

GROUP BY는 집계 조회를 위한 것이기 떄문에 SELECT에서 사용하는 조회 요소들도 집계 요소가 되어야 한다는 뜻!

 

HAVING의 특징

- TRUE로평가되는 그룹들만 필터링 한 후 다음 논리적 프로세싱 단계로 전송한

- FALSEUNKNOW으로 평가되는 그룹들은 제거된다.

- HAVING절은 행들이 그룹핑된 다음에 처리되기 때문에 집계함수를 사용할수있다

 

<GROUP BY 2번쨰 예제>

명령어에서 YEAR(orderdate)를 없애보았다.

 

 empid에 따른 고객71번의 주문 건수가 나올것을 예상 할 수 있다.