집계 함수 종류

함수 설명
COUNT(컬럼명) NULL이 아닌 레코드의 개수를 반환
COUNT(DISTINCT) NULL이 아닌 레코드의 개수를 반환 (중복은 1개만 인정)
SUM(컬럼명) 합계를 반환
AVG(컬럼명) 평균을 반환
MAX(컬럼명) 최대값을 반환
MIN(컬럼명) 최소값을 반환
GROUP BY 데이터를 그룹화
HAVING 그룹화 한 데이터에 대한 조건식. GROUP BY에 대한 WHERE 절.

샘플 데이터

아래는 집계함수에서 사용할 샘플 데이터입니다.

샘플 데이터 sql (열기/접기)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
DROP TABLE IF EXISTS `math_sample`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;

CREATE TABLE `math_sample` (
  `sell_id` varchar(100) DEFAULT NULL,
  `product` varchar(20) DEFAULT NULL,
  `price` int(11) DEFAULT NULL,
  `amount` int(11) DEFAULT NULL,
  `sell_date` date DEFAULT NULL,
  `sell_datetime` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `math_sample`
--

LOCK TABLES `math_sample` WRITE;
/*!40000 ALTER TABLE `math_sample` DISABLE KEYS */;
INSERT INTO `math_sample` VALUES
('0001','APPLE',1500,20,'2024-01-02','2024-01-02 15:30:00'),
('0002','APPLE',1300,50,'2024-01-05','2024-01-05 11:29:30'),
('0003','APPLE',1100,250,'2024-01-08','2024-01-08 10:25:47'),
('0004','BANANA',2100,23,'2024-01-15','2024-01-15 15:30:40'),
('0005','BANANA',2000,20,'2024-01-18','2024-01-18 09:42:53'),
('0006','BANANA',1900,2000,'2024-01-22','2024-01-22 21:53:22'),
('0007','ORANGE',3100,200,'2024-01-29','2024-01-29 11:53:22'),
('0008','ORANGE',2800,400,'2024-02-01','2024-02-01 17:23:55'),
('0009','ORANGE',3600,40,'2024-02-05','2024-02-05 10:54:22'),
('0010','GRAPE',NULL,NULL,NULL,NULL);

/*!40000 ALTER TABLE `math_sample` ENABLE KEYS */;
UNLOCK TABLES;

집계 함수

COUNT

레코드의 개수를 반환합니다. 값이 NULL 인 경우는 COUNT에서 제외됩니다.

1
2
3
4
5
SELECT COUNT(*) FROM math_sample;
-- >> 10
SELECT COUNT(price) FROM math_sample;
-- >> 9
-- 0010 의 price 는 Null 이기 때문에 count에서 제외

DISTINCT는 중복된 값은 한 번만 카운팅합니다.

1
2
3
4
5
6
SELECT COUNT(DISTINCT product) FROM math_sample;
-- >> 4
-- APPLE, BANANA, ORANGE, GRAPE
SELECT COUNT(product) FROM math_sample;
-- >> 10
-- APPLE, APPLE, APPLE, BANANA, BANANA, BANANA, ORANGE, ORANGE, ORANGE, GRAPE

모든 컬럼에 대한 레코드 수를 조회할 때에는 * 을 사용합니다.

1
2
SELECT COUNT(*) FROM math_sample;
-- >> 10


SUM

지정한 컬럼의 합계를 반환합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT product, SUM(price) FROM math_sample
GROUP BY product;
+---------+------------+
| product | SUM(price) |
+---------+------------+
| APPLE   |       3900 |
| BANANA  |       6000 |
| GRAPE   |       NULL |
| ORANGE  |       9500 |
+---------+------------+

SELECT product, SUM(price) FROM math_sample;
+---------+------------+
| product | SUM(price) |
+---------+------------+
| APPLE   |      19400 |
+---------+------------+

DATE 혹은 DATETIME 형식도 합계가 가능합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT SUM(sell_date) FROM math_sample;
+----------------+
| SUM(sell_date) |
+----------------+
|      182161205 |
+----------------+

SELECT SUM(sell_datetime) FROM math_sample;
+--------------------+
| SUM(sell_datetime) |
+--------------------+
|    182161206224191 |
+--------------------+

연산할 수 있는 데이터 형식만 다룰 수 있으며, varchar와 같은 문자열은 0을 반환합니다.

1
2
3
4
5
6
SELECT SUM(product) FROM math_sample;
+--------------+
| SUM(product) |
+--------------+
|            0 |
+--------------+


AVG

평균을 반환합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT product, AVG(price), SUM(amount)
FROM math_sample GROUP BY product;
+---------+------------+-------------+
| product | AVG(price) | SUM(amount) |
+---------+------------+-------------+
| APPLE   |  1300.0000 |         320 |
| BANANA  |  2000.0000 |        2043 |
| GRAPE   |       NULL |        NULL |
| ORANGE  |  3166.6667 |         640 |
+---------+------------+-------------+

SELECT product, AVG(price), SUM(amount)
FROM math_sample;
+---------+------------+-------------+
| product | AVG(price) | SUM(amount) |
+---------+------------+-------------+
| APPLE   |  2155.5556 |        3003 |
+---------+------------+-------------+

SUM과 같이 DATE, DATETIME과 같은 형식도 연산이 가능합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT AVG(sell_date) FROM math_sample;
+----------------+
| AVG(sell_date) |
+----------------+
|  20240133.8889 |
+----------------+

SELECT AVG(sell_datetime) FROM math_sample;
+---------------------+
| AVG(sell_datetime)  |
+---------------------+
| 20240134024910.1111 |
+---------------------+

연산할 수 있는 데이터 형식만 다룰 수 있으며, varchar와 같은 문자열은 0을 반환합니다.

1
2
3
4
5
6
SELECT AVG(product) FROM math_sample;
+--------------+
| AVG(product) |
+--------------+
|            0 |
+--------------+


MAX, MIN

MAX 는 최대값을, MIN 은 최소값을 반환합니다.

1
2
3
4
5
6
7
8
9
10
SELECT product, MAX(price), MIN(price)
FROM math_sample GROUP BY product;
+---------+------------+------------+
| product | MAX(price) | MIN(price) |
+---------+------------+------------+
| APPLE   |       1500 |       1100 |
| BANANA  |       2100 |       1900 |
| GRAPE   |       NULL |       NULL |
| ORANGE  |       3600 |       2800 |
+---------+------------+------------+

DATE, DATETIME 의 경우 MIN은 가장 빠른 날짜, MAX는 가장 늦은 날짜를 반환합니다.

1
2
3
4
5
6
7
8
9
10
SELECT product, MAX(sell_date), MIN(sell_datetime)
FROM math_sample GROUP BY product;
+---------+----------------+---------------------+
| product | MAX(sell_date) | MIN(sell_datetime)  |
+---------+----------------+---------------------+
| APPLE   | 2024-01-08     | 2024-01-02 15:30:00 |
| BANANA  | 2024-01-22     | 2024-01-15 15:30:40 |
| GRAPE   | NULL           | NULL                |
| ORANGE  | 2024-02-05     | 2024-01-29 11:53:22 |
+---------+----------------+---------------------+

문자열의 경우 사전적 순서에 따라서 MAX는 가장 큰 값(정렬시 마지막)을, MIN은 가장 작은 값(정렬시 처음)을 반환합니다.

1
2
3
4
5
6
SELECT MAX(product), MIN(product) FROM math_sample;
+--------------+--------------+
| MAX(product) | MIN(product) |
+--------------+--------------+
| ORANGE       | APPLE        |
+--------------+--------------+

GROUP BY

GROUP BY는 데이터를 그룹화grouping 하는 함수입니다.

위 예시 데이터를 보면 product가 APPLE, BANANA, ORANGE 인 레코드가 여러 개가 있습니다. 집계(혹은 통계)를 내기 위해 각각의 product로 묶어야 할 경우 GROUP BY product 라는 절을 추가하면 됩니다.

1
2
3
4
5
6
7
8
9
10
SELECT product, SUM(amount)
FROM math_sample GROUP BY product;
+---------+-------------+
| product | SUM(amount) |
+---------+-------------+
| APPLE   |         320 |
| BANANA  |        2043 |
| GRAPE   |        NULL |
| ORANGE  |         640 |
+---------+-------------+

HAVING

HAVING 은 그룹화grouping 한 데이터에 대해 조회 조건을 적용하는 기능을 합니다. 즉 GROUP BY에 대한 WHERE 절이라고 보면 되겠습니다.

1
2
3
4
5
6
7
8
9
10
11
SELECT product, SUM(amount)
FROM math_sample
GROUP BY product
HAVING SUM(amount) > 600;

+---------+-------------+
| product | SUM(amount) |
+---------+-------------+
| BANANA  |        2043 |
| ORANGE  |         640 |
+---------+-------------+

Reference

혼자 공부하는 SQL (우재남)
연습용 데이터베이스 : https://www.mysqltutorial.org/
Math 함수 : https://inpa.tistory.com/