[SQL] : Aggregate Functions (집계함수) (3) / GROUP BY, HAVING

김대현·2024년 6월 13일

(1) Aggregate Functions (집계함수) *
(2) GROUP BY
(3) HAVING

(1) GROUP BY

  • Aggregate Functions (집계함수) 는 데이터베이스에서 사용되는 함수들로 여러가지가 존재한다. 집계함수는 여러 칼럼 혹은 테이블 전체 칼럼으로부터 연산을 수행하고 그 결과를 하나의 결과값으로 반환하는 함수이다. 주로 데이터베이스 쿼리에서 사용되며, 데이터의 합계, 평균, 최대값, 최소값 등을 계산하는데 쓰인다.
+----------+---------------------------+
| Function | Description               |
+----------+---------------------------+
| COUNT    | 총 갯수를 계산해주는 함수     |
| SUM      | 합계를 계산해 주는 함수       |
| AVG      | 평균을 계산해 주는 함수       |
| MIN      | 가장 작은 값을 찾아주는 함수   |
| MAX      | 가장 큰 값을 찾아주는 함수    |
| FIRST    | 첫번째 결과값을 리턴하는 함수  |
| LAST     | 마지막 결과값을 리턴하는 함수  |
+----------+---------------------------+



(2) GROUP BY

  • 집계함수에서 groupby 함수는 데이터를 특정 기준에 따라 그룹으로 묶고, 각 그룹에 대해 집계 연산을 수행할 때 사용하는 함수이다. 주로 데이터 분석이나 데이터베이스에서 사용되며, 다양한 집계 연산을 수행할 수 있다. group by 함수를 사용하면 테이블을 그룹화해서 필요한 데이터를 조회할 수 있다.
#crime_status 테이블의 police_station 열에서 경찰서별로 그룹화 하여 경찰서 이름을 조회

SELECT police_station
FROM crime_status
GROUP BY police_station
ORDER BY police_station
LIMIT 5;
  • GROUP BY police_station: police_station 열에 따라 데이터를 그룹화하라는 의미로 같은 police_station 값들을 가진 행들이 하나의 그룹으로 묶이게 되어 하나의 결과값이 출력되는 것이다.

  • ORDER BY police_station LIMIT 5; police_station 열의 값으로 결과를 오름차순으로 정렬하라는 의미로 순으로 이름이 정렬이 될 것이며 LIMIT 5로 인해 조회된 결과의 최대 반환 개수를 5개로 제한해 첫 5개의 결과값만 출력될 것이다.

  • 결과값

#crime_status 테이블에서 경찰서별로 그룹화 하여 경찰서 이름을 조회
mysql>SELECT police_station
	  FROM crime_status
	  GROUP BY police_station
	  ORDER BY police_station
	  LIMIT 5;
+-----------------+
|  police_station |
+-----------------+
|  강남            |
|  강동            |
|  강북            |
|  강서            |
|  관악            |
+-----------------+
  • 예제 2
#crime_status 테이블에서 경찰서별로 그룹화 하여 경찰서 종류를 검색
#DISTINCT 를 사용하여 중복을 제거하는 경우에는 ORDER BY 를 사용할 수 없다.
mysql>SELECT DISTINCT police_station
	  FROM crime_status
	  LIMIT 5;
+-----------------+
|  police_station |
+-----------------+
|  중부            |
|  종로            |
|  남대문          |
|  서대문          |
|  혜화            |
+-----------------+
  • DISTINCT 를 사용하여 중복을 제거하는 경우에는 ORDER BY 함수를 사용하여 그룹화 할 수 없다.



(3) HAVING

  • 집계함수에서 HAVING 은 해석상 조건을 두는 WHERE절과 동일하다. 단, 조건 내용에 그룹 함수를 포함되는 경우에만 WHERE 조건 대신 HAVING 을 사용한다. 즉 그룹화된 결과에 조건을 적용할 때 사용되는 것으로 그룹화하여 필터링한 데이터에 조건을 걸어 2차 필터링하여 출력하는 것이다.

  • 일반적인 SQL 에서 HAVING GROUP BY 다음에 위치하며, 그룹화된 결과에 대한 조건을 명시하는 것이다.

#Crime_status 테이블의 police_station 열에서 경찰서 별로 발생한 범죄 건수의 합이 4000 건보다 보다 큰 경우를 검색

SELECT police_station
FROM crime_status
WHERE status_type LIKE `발생`
GROUP BY police_station
HAVING count > 4000;
  • WHERE status_type LIKE '발생' : police_station 열의 값 중 status_type 열의 값이 '발생'인 행들을 선택하겠다는 의미이다.

  • ORDER BY police_station: police_station 열의 값으로 결과를 오름차순으로 정렬하라는 의미로 순으로 이름이 정렬이 될 것이다.

  • HAVING count > 4000;: HAVING 을 사용해 Group by 를 사용해 그룹화된 데이터에 대한 2차 필터링을 수행합는 것이다. 그룹화된 결과 중에서 집계 함수 (여기서는 COUNT)를 통해 계산된 값이 4000을 초과하는 그룹만을 선택하겠다는 의미이다.

  • 결과값

#Crime_status 테이블의 police_station 열에서 경찰서 별로 발생한 범죄 건수의 합이 4000 건보다 보다 큰 경우를 검색
mysql>SELECT police_station
	  FROM crime_status
	  WHERE status_type LIKE `발생`
	  GROUP BY police_station <- # 만약 두 개의 그룹으로 묶는다면 두개의 조건이 일치하는 케이스로 묶음
	  HAVING count > 4000;
+----------------+----------------------------+
| police_station | count                      |
+----------------+----------------------------+
| 영등포          | 5217                       |
| 강남           | 4754                       |
| 관악           | 5261                       |
| 강서           | 4415                       |
| 구로           | 4175                       |
| 송파           | 5410                       |
+----------------+----------------------------+
profile
데이터 분석 스쿨 블로그 입니다.

0개의 댓글