SQL - Aggregate Functions (집계함수)

Yang HyunIl·2023년 2월 15일
0

SQL

목록 보기
12/14
post-thumbnail

Aggregate Functions (집계함수)

  • 여러 칼럼 혹은 테이블 전체 칼럼으로부터 하나의 결과값을 반환하는 함수
FunctionDescription
COUNT총 갯수를 계산해주는 함수
SUM합계를 계산해주는 함수
AVG평균을 계산해주는 함수
MIN가장 작은 값을 찾아주는 함수
MAX가장 큰 값을 찾아주는 함수
FIRST첫번째 결과값을 리턴하는 함수
LAST마지막 결과값을 리턴하는 함수

🔴COUNT

  • 총 갯수를 계산해주는 함수
SELECT COUNT(column)
FROM tablename
WHERE condition;

예제 1

police_station 테이블에서 데이터 총 갯수

mysql> select count(*) from police_station;
+----------+
| count(*) |
+----------+
|       31 |
+----------+

예제 2

crime_status 테이블에서 경찰서 총 갯수

mysql> select count(distinct police_station) from crime_status;
+--------------------------------+
| count(distinct police_station) |
+--------------------------------+
|                             31 |
+--------------------------------+

예제 3

crime_status 총 갯수

mysql> select count(distinct crime_status) from crime_status;
+------------------------------+
| count(distinct crime_status) |
+------------------------------+
|                            6 |
+------------------------------+

🔴SUM

  • 숫자 칼럼의 합계를 계산해주는 함수
SELECT SUM(column)
FROM tablename
WHERE condition;

예제 1

범죄 총 발생 건수

mysql> select sum(case_number) from crime_status where status_type='발생';
+------------------+
| sum(case_number) |
+------------------+
|            92679 |
+------------------+

예제 2

살인 총 발생 건수

mysql> select sum(case_number) from crime_status where status_type='발생' and crime_type like '살인';
+------------------+
| sum(case_number) |
+------------------+
|              141 |
+------------------+

예제 3

중부 경찰서에서 검거된 총 범죄 건수

mysql> select sum(case_number) from crime_status where police_station='중부' and status_type='검거';
+------------------+
| sum(case_number) |
+------------------+
|             1406 |
+------------------+

🔴AVG

  • 숫자 컬럼의 평균을 계산해주는 함수
SELECT AVG(column)
FROM tablename
WHERE condition;

예제 1

평균 폭력 검거 건수

mysql> select avg(case_number) from crime_status where crime_type like '%폭력%' and status_type='검거';
+------------------+
| avg(case_number) |
+------------------+
|        1323.1935 |
+------------------+

예제 2

중부경찰서 범죄 평균 발생 건수

mysql> select avg(case_number) from crime_status where police_station='중부' and status_type='발생';
+------------------+
| avg(case_number) |
+------------------+
|         411.4000 |
+------------------+

🔴MIN

  • 숫자 컬럼 중 가장 작은 값을 찾아주는 함수
SELECT MIN(column)
FROM tablename
WHERE conditon;

예제 1

강도 발생 건수가 가장 적은 경우 건수

mysql> select min(case_number) from crime_status where crime_type like '%강도%' and status_type='발생';
+------------------+
| min(case_number) |
+------------------+
|                1 |
+------------------+

예제 2

중부경찰서에서 가장 낮은 검거 건수

mysql> select min(case_number) from crime_status where police_station='중부' and status_type='검거';
+------------------+
| min(case_number) |
+------------------+
|                1 |
+------------------+

🔴MAX

  • 숫자 컬럼 중 가장 큰 값을 찾아주는 함수
SELECT MAX(column)
FROM tablename
WHERE condtion;

예제 1

살인이 가장 많이 검거된 건수

mysql> select max(case_number) from crime_status where crime_type like '%살인%' and status_type = '검거';
+------------------+
| max(case_number) |
+------------------+
|               12 |
+------------------+

예제 2

강남경찰서에서 가장 많이 발생한 범죄 건수

mysql> select max(case_number) from crime_status where police_station='강남' and status_type='발생';
+------------------+
| max(case_number) |
+------------------+
|             2283 |
+------------------+

🔴GROUP BY

  • 그룹화하여 데이터를 조회
SELECT column1, column2, ...
FROM table
WHERE condition
GROUP BY column1, column2, ...
ORDER BY column1, column2, ...;

예제 1

crime_status에서 경찰서별로 그룹화하여 경찰서 이름을 조회

mysql> select police_station
    -> from crime_status
    -> group by police_station 
    -> order by police_station limit 5;
+----------------+
| police_station |
+----------------+
| 강남           |
| 강동           |
| 강북           |
| 강서           |
| 관악           |
+----------------+

❗ DISTINCT를 사용하는 경우 ORDER BY를 사용할 수 없음

예제 2

경찰서별로 총 발생 범죄 건수를 검색

mysql> select police_station, sum(case_number) 발생건수
    -> from crime_status
    -> where status_type ='발생'
    -> group by police_station
    -> order by 발생건수 desc limit 10;
+----------------+--------------+
| police_station | 발생건수     |
+----------------+--------------+
| 송파           |         5410 |
| 관악           |         5261 |
| 영등포         |         5217 |
| 강남           |         4754 |
| 강서           |         4415 |
| 구로           |         4175 |
| 강동           |         3788 |
| 서초           |         3765 |
| 노원           |         3743 |
| 중랑           |         3726 |
+----------------+--------------+

예제 3

경찰서별로 평균 범죄 검거 건수를 검색

mysql> select police_station, avg(case_number) 평균검거건수
    -> from crime_status
    -> where status_type='검거'
    -> group by police_station
    -> order by 평균검거건수 desc limit 10;
+----------------+--------------------+
| police_station | 평균검거건수       |
+----------------+--------------------+
| 관악           |           771.6000 |
| 송파           |           708.8000 |
| 강서           |           678.6000 |
| 강남           |           674.6000 |
| 영등포         |           674.2000 |
| 구로           |           596.8000 |
| 중랑           |           556.2000 |
| 강동           |           532.4000 |
| 노원           |           516.2000 |
| 마포           |           506.8000 |
+----------------+--------------------+

예제 4

경찰서별 평균 범죄 발생 건수와 평균 범죄 건거 검수를 검색

mysql> select police_station, status_type, avg(case_number)                     
    -> from crime_status
    -> group by police_station, status_type limit 10;
+----------------+-------------+------------------+
| police_station | status_type | avg(case_number) |
+----------------+-------------+------------------+
| 중부           | 발생        |         411.4000 |
| 중부           | 검거        |         281.2000 |
| 종로           | 발생        |         338.8000 |
| 종로           | 검거        |         235.8000 |
| 남대문         | 발생        |         270.8000 |
| 남대문         | 검거        |         183.4000 |
| 서대문         | 발생        |         506.6000 |
| 서대문         | 검거        |         341.2000 |
| 혜화           | 발생        |         281.6000 |
| 혜화           | 검거        |         198.8000 |
+----------------+-------------+------------------+

🔴HAVING

  • 조건에 집계함수가 포함되는 경우 WHERE 대신 HAVING 사용
SELECT column1, column2, ...
FROM tablename
WHERE condition
GROUP BY column1, column2, ...
HAVING condition (Aggregate Functions)
ORDER BY column1, column2, ...

예제 1

경찰서별로 발생한 범죄 건수의 합이 4000건보다 큰 경우를 탐색

mysql> select police_station, sum(case_number) count
    -> from crime_status
    -> where status_type = '발생'
    -> group by police_station
    -> having count > 4000; 
+----------------+-------+
| police_station | count |
+----------------+-------+
| 영등포         |  5217 |
| 강남           |  4754 |
| 관악           |  5261 |
| 강서           |  4415 |
| 구로           |  4175 |
| 송파           |  5410 |
+----------------+-------+

예제 2

경찰서별로 발생한 폭력과 절도의 범죄 건수 평균이 2000이상인 경우를 탐색

mysql> select police_station, avg(case_number) avg
    -> from crime_status
    -> where status_type='발생' and (crime_type like '%폭력%' or crime_type like '%절도%')
    -> group by police_station
    -> having avg > 2000;      
+----------------+-----------+
| police_station | avg       |
+----------------+-----------+
| 영등포         | 2444.5000 |
| 강남           | 2112.0000 |
| 관악           | 2421.5000 |
| 강서           | 2067.0000 |
| 송파           | 2552.0000 |
+----------------+-----------+
profile
ヾ(•ω•`)o

0개의 댓글