bdfgdfg

Group By/Having/집계 함수 본문

CS/SQL

Group By/Having/집계 함수

marmelo12 2022. 9. 27. 22:04
반응형

Gropu by는 집계 연산자(sum,count,avg,max,min등)를 실행할 떄 기준을 알려주는 라인이다.

즉 어떤 유형별로 데이터를 가져오고 싶을 때.

 

참고로.

GROUP BY를 사용할 때는 두가지를 기억해야 합니다.

특정 컬럼을 그룹화 하는 GROUP BY 

특정 컬럼을 그룹화한 결과에 조건을 거는 HAVING

 

* WHERE랑 HAVING을 헷깔리는 경우가 많은데 WHERE는 그룹화 하기 전이고, HAVING은 그룹화 후에 조건입니다.

 -> 참고 : https://extbrain.tistory.com/56

 

 

예로들어 직원이라는 테이블이 존재한다고 생각해보자.

그렇다면 그 안에 Country라는 칼럼이 존재한다고 할 때

만약 내가 나라별로 회사원들의 수를 구하고싶다고 한다면 밑과 같이 작성이 가능하다.

SELECT Country, count(Country) AS Cnt from
	Employees
    Group by Country

좀더 깔끔하게 나라에 사는 직원이 많을수록 내림차순하도록 바꾸면

SELECT Country, count(Country) AS Cnt from
	Employees
    Group by Country
    Order by Cnt DESC;

위와 같이 사용할 수 있다.

 -> AS는 별칭이라고 보면 된다.

 

만약 집계함수를 같이 사용하지 않고 단순 select * from Employees Group By Country를 할 경우.

단순 해당 Country 유형별(그룹화)로 나뉠 때 맨 앞의 데이터(행)만 나타낸다.

 -> 간단히말해 Country별로 검색했을 때 제일 앞에 있는 녀석들로만 출력이 된다는 의미.

 

어렵지 않다. 즉 말그대로 유형별로 그룹화하여 SELECT하는 것.

 -> 만약 어렵다면 유형별로, 즉 나라별로~, 도시별로~라고 먼저 생각해보면 쉽다.

 

Having은 Group by와 함께 사용되는 절이다. (Group by없이 사용불가능)

Having은 단순하게 말하면 Group by를 통해 집계한 데이터에 조건을 걸고싶을 때 사용한다.

 -> 예로들어서 위 Group by예제에서 나라별로 직원수의 수를 조회할 때 5명이상! 이라는 조건을 걸고 싶을 떄 Having을 쓴다.

 -> Where이랑 헷갈릴 수 있는데 Having은 그룹을 나타내는 결과에 대해서만 필터(조건)를 거는것이고, where절은 개별행에 적용이 되는 것.

Having절

  • 앞에서 했던 내용중에 사용자별로 총구매액을 구해보자.
SELECT userid '사용자',sum(price*amount)'총구매액' FROM buytbl GROUP BY userid;
  • 그런데, 이 중에서 총 구매액이 1,000이상인 사용자에게만 사은품을 증정하고 싶다면 앞에서 배운 조건을 포함하는 WHERE구문을 생각할 수 있을겁니다.
  • 하지만 WHERE절에는 집계함수가 나타낼 수가 없습니다.
  • 그럴 떄 사용되는 것이 HAVING절입니다.
  • HAVING은 WHERE와 비슷한 개념으로 조건을 제한하는 것이지만, 집계 함수에 대해서 조건을 제한하는 것이라고 생각하면 됩니다.
  • 그리고 HAVING절은 꼭 GROUP BY절 다음에 나와야 합니다.(순서가 바뀌면 안된다.

- 출처 https://velog.io/@jyyoun1022/GROUP-BY-%EB%B0%8F-HAVING%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%A7%91%EA%B3%84%ED%95%A8%EC%88%98

Having은 집계함수으로 조건을 사용할 수 있다. where절에는 집계함수 사용불가

 

SELECT Country, count(distinct CustomerID) AS cnt  from
	Customers
    Group by Country
    Having count(Country) >= 5 -- 혹은 count(*) >= 5
	order by cnt DESC

(집계함수 count에 distinct가 추가되었는데, CustomerID가 동일한것은 중복해서 count하지않게 하기 위함.)

 

참고로 SELECT/FROM/WHERE/GROUP BY/HAVING/ORDER BY의 실행 순서는

from -> where -> group by -> having -> select -> order by이다.

 

 

반응형

'CS > SQL' 카테고리의 다른 글

SQL 재구매가 일어난 상품과 회원 리스트 구하기  (0) 2022.12.14
SQL 인기있는 아이스크림 (이중 정렬)  (0) 2022.12.13
Join  (0) 2022.09.28
SELECT/FROM/WHERE/ORDER BY  (0) 2022.09.26
SQL  (0) 2022.09.26
Comments