(1) Aggregate Functions (집계함수) *
(2) GROUP BY
(3) HAVING
Aggregate Functions (집계함수) 는 데이터베이스에서 사용되는 함수들로 여러가지가 존재한다. 집계함수는 여러 칼럼 혹은 테이블 전체 칼럼으로부터 연산을 수행하고 그 결과를 하나의 결과값으로 반환하는 함수이다. 주로 데이터베이스 쿼리에서 사용되며, 데이터의 합계, 평균, 최대값, 최소값 등을 계산하는데 쓰인다.+----------+---------------------------+
| Function | Description |
+----------+---------------------------+
| COUNT | 총 갯수를 계산해주는 함수 |
| SUM | 합계를 계산해 주는 함수 |
| AVG | 평균을 계산해 주는 함수 |
| MIN | 가장 작은 값을 찾아주는 함수 |
| MAX | 가장 큰 값을 찾아주는 함수 |
| FIRST | 첫번째 결과값을 리턴하는 함수 |
| LAST | 마지막 결과값을 리턴하는 함수 |
+----------+---------------------------+
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 |
+-----------------+
| 강남 |
| 강동 |
| 강북 |
| 강서 |
| 관악 |
+-----------------+
#crime_status 테이블에서 경찰서별로 그룹화 하여 경찰서 종류를 검색
#DISTINCT 를 사용하여 중복을 제거하는 경우에는 ORDER BY 를 사용할 수 없다.
mysql>SELECT DISTINCT police_station
FROM crime_status
LIMIT 5;
+-----------------+
| police_station |
+-----------------+
| 중부 |
| 종로 |
| 남대문 |
| 서대문 |
| 혜화 |
+-----------------+
DISTINCT 를 사용하여 중복을 제거하는 경우에는 ORDER BY 함수를 사용하여 그룹화 할 수 없다.집계함수에서 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 |
+----------------+----------------------------+