이번 시간에는 Group query
라고 불리우는 SQL의 Group by
, Having
절에 대해서 알아보겠습니다.
xxxxxxxxxx
mysql> select * from citykorea;
+------+------------+---------------+------------+
| id | name | district | population |
+------+------------+---------------+------------+
| 2331 | Seoul | Seoul | 9981619 |
| 2332 | Pusan | Pusan | 3804522 |
| 2333 | Inchon | Inchon | 2559424 |
| 2334 | Taegu | Taegu | 2548568 |
| 2335 | Taejon | Taejon | 1425835 |
| 2336 | Kwangju | Kwangju | 1368341 |
| 2337 | Ulsan | Kyongsangnam | 1084891 |
| 2338 | Songnam | Kyonggi | 869094 |
| 2339 | Puchon | Kyonggi | 779412 |
| 2340 | Suwon | Kyonggi | 755550 |
| 2341 | Anyang | Kyonggi | 591106 |
| 2342 | Chonju | Chollabuk | 563153 |
| 2343 | Chongju | Chungchongbuk | 531376 |
| 2344 | Koyang | Kyonggi | 518282 |
| 2345 | Ansan | Kyonggi | 510314 |
| 2346 | Pohang | Kyongsangbuk | 508899 |
| 2347 | Chang-won | Kyongsangnam | 481694 |
| 2348 | Masan | Kyongsangnam | 441242 |
| 2349 | Kwangmyong | Kyonggi | 350914 |
| 2350 | Chonan | Chungchongnam | 330259 |
| 2351 | Chinju | Kyongsangnam | 329886 |
| 2352 | Iksan | Chollabuk | 322685 |
| 2353 | Pyongtaek | Kyonggi | 312927 |
| 2354 | Kumi | Kyongsangbuk | 311431 |
| 2355 | Uijongbu | Kyonggi | 276111 |
| 2356 | Kyongju | Kyongsangbuk | 272968 |
| 2357 | Kunsan | Chollabuk | 266569 |
| 2358 | Cheju | Cheju | 258511 |
| 2359 | Kimhae | Kyongsangnam | 256370 |
| 2360 | Sunchon | Chollanam | 249263 |
| 2361 | Mokpo | Chollanam | 247452 |
| 2362 | Yong-in | Kyonggi | 242643 |
| 2363 | Wonju | Kang-won | 237460 |
| 2364 | Kunpo | Kyonggi | 235233 |
| 2365 | Chunchon | Kang-won | 234528 |
| 2366 | Namyangju | Kyonggi | 229060 |
| 2367 | Kangnung | Kang-won | 220403 |
| 2368 | Chungju | Chungchongbuk | 205206 |
| 2369 | Andong | Kyongsangbuk | 188443 |
| 2370 | Yosu | Chollanam | 183596 |
| 2371 | Kyongsan | Kyongsangbuk | 173746 |
| 2372 | Paju | Kyonggi | 163379 |
| 2373 | Yangsan | Kyongsangnam | 163351 |
| 2374 | Ichon | Kyonggi | 155332 |
| 2375 | Asan | Chungchongnam | 154663 |
| 2376 | Koje | Kyongsangnam | 147562 |
| 2377 | Kimchon | Kyongsangbuk | 147027 |
| 2378 | Nonsan | Chungchongnam | 146619 |
| 2379 | Kuri | Kyonggi | 142173 |
| 2380 | Chong-up | Chollabuk | 139111 |
| 2381 | Chechon | Chungchongbuk | 137070 |
| 2382 | Sosan | Chungchongnam | 134746 |
| 2383 | shiheung | Kyonggi | 133443 |
| 2384 | Tong-yong | Kyongsangnam | 131717 |
| 2385 | Kongju | Chungchongnam | 131229 |
| 2386 | Yongju | Kyongsangbuk | 131097 |
| 2387 | Chinhae | Kyongsangnam | 125997 |
| 2388 | Sangju | Kyongsangbuk | 124116 |
| 2389 | Poryong | Chungchongnam | 122604 |
| 2390 | Kwang-yang | Chollanam | 122052 |
| 2391 | Miryang | Kyongsangnam | 121501 |
| 2392 | Hanam | Kyonggi | 115812 |
| 2393 | Kimje | Chollabuk | 115427 |
| 2394 | Yongchon | Kyongsangbuk | 113511 |
| 2395 | Sachon | Kyongsangnam | 113494 |
| 2396 | Uiwang | Kyonggi | 108788 |
| 2397 | Naju | Chollanam | 107831 |
| 2398 | Namwon | Chollabuk | 103544 |
| 2399 | Tonghae | Kang-won | 95472 |
| 2400 | Mun-gyong | Kyongsangbuk | 92239 |
+------+------------+---------------+------------+
오늘 도움을 줄 citykorea
라는 테이블입니다. (위의 테이블은 mysql 홈페이지에서 제공하는 연습용 Database인 world에 속해있는 테이블입니다.)
1. 집계함수
우선 오늘 다룰 Group By, Having
을 이해하기 위해서는 집계함수
에 대한 이해가 선행적으로 필요합니다. Group by 와 Having
이 집계함수
의 결과값을 다루는 쿼리이기 때문입니다.
1.1 의미
집계함수
는 말그대로 어떤 데이터를 집계하는 함수들을 의미합니다. 예를 들어 어떤 팀에 속한 사원의 수
, 어떤 팀의 연봉합계
, 어떤 팀의 나이의 평균
등 집계성 정보를 반환하는 함수들을 의미합니다.
1.2 종류
COUNT
xxxxxxxxxx
mysql> select count(*) from citykorea;
+----------+
| count(*) |
+----------+
| 70 |
+----------+
1 row in set (0.00 sec)
위의 쿼리는 집계함수 count
를 이용해 citykorea
의 모든 레코드의 수를 출력하는 쿼리입니다.
SUM
mysql> select sum(population) from citykorea;
+-----------------+
| sum(population) |
+-----------------+
| 38999893 |
+-----------------+
1 row in set (0.00 sec)
위의 쿼리는 집계함수 sum
을 이용해 citykorea
의 인구수 합계를 출력하는 쿼리입니다.
MAX&MIN
xxxxxxxxxx
mysql> select name, max(population) from citykorea;
+-------+-----------------+
| name | max(population) |
+-------+-----------------+
| Seoul | 9981619 |
+-------+-----------------+
1 row in set (0.01 sec)
위의 쿼리는 집계함수 max
를 이용해 citykorea
의 가장 많은 인구수를 가진 도시의 이름과, 인구수를 출력한 쿼리입니다.
AVG
mysql> select avg(population) from citykorea;
+-----------------+
| avg(population) |
+-----------------+
| 557141.3286 |
+-----------------+
1 row in set (0.00 sec)
위 쿼리는 집계함수 avg
를 이용해, citykorea
의 평균 인구수를 출력하는 쿼리입니다.
2. Group query (Group by, Having)
드디어 Group By와 Having
절을 배워볼 시간입니다.
2.1 Group By
Group By
는 집계함수의 결과를 특정 컬럼을 기준으로 묶어 결과를 출력해주는 쿼리입니다.
형식
xxxxxxxxxx
SELECT column, 집계함수(column)
FROM TABLE
(WHERE column = data)
GROUP BY column;
형식은 위와 같습니다. SELECT
절에 Group으로 묶을 column과, 집계함수를 사용합니다. (FROM, WHERE의 설명은 생략하겠습니다.) 마지막으로 GROUP BY에 Group의 기준컬럼을 입력합니다.
예제
> citykorea 테이블의 도시별 인구 합계를 출력하시오.
mysql> SELECT district, sum(population)
-> FROM citykorea
-> GROUP BY district;
+---------------+-----------------+
| district | sum(population) |
+---------------+-----------------+
| Seoul | 9981619 |
| Pusan | 3804522 |
| Inchon | 2559424 |
| Taegu | 2548568 |
| Taejon | 1425835 |
| Kwangju | 1368341 |
| Kyongsangnam | 3397705 |
| Kyonggi | 6489573 |
| Chollabuk | 1510489 |
| Chungchongbuk | 873652 |
| Kyongsangbuk | 2063477 |
| Chungchongnam | 1020120 |
| Cheju | 258511 |
| Chollanam | 910194 |
| Kang-won | 787863 |
+---------------+-----------------+
15 rows in set (0.00 sec)
위처럼 SELECT
절에 GROUP BY
의 그룹핑 대상이 되는 COLUMN을 같이 출력해주는 것이 원하는 데이터를 얻는데에 도움이 됩니다.
2.2 Having
Having
은 GROUP BY
쿼리의 결과를 다시 필터링하기 위한 쿼리입니다. 마치 SELECT
의 결과에 조건을 걸때 WHERE
를 사용하듯이 말입니다.
형식
x
SELECT column, 집계함수(column)
FROM TABLE
(WHERE column = data)
GROUP BY column
(HAVING 집계함수(column) 부등호 data)
앞서 사용했던 GROUP BY
에 추가적으로, HAVING
을 사용하면 됩니다. 조건 비교에 사용될 데이터는 당연히 집계함수의 결과
를 사용해야합니다. 바로 예를들어 설명드리겠습니다.
예시
> citykorea 테이블의 도시별 인구수 평균이 500,000만을 초과하는 도시별 인구수 평균을 출력하시오.
xxxxxxxxxx
mysql> SELECT district, AVG(population)
-> FROM citykorea
-> GROUP BY district
-> HAVING AVG(population) > 500000;
+----------+-----------------+
| district | AVG(population) |
+----------+-----------------+
| Seoul | 9981619.0000 |
| Pusan | 3804522.0000 |
| Inchon | 2559424.0000 |
| Taegu | 2548568.0000 |
| Taejon | 1425835.0000 |
| Kwangju | 1368341.0000 |
+----------+-----------------+
6 rows in set (0.00 sec)
위와 같이 HAVING
절에 조건을 부여할때에는 GROUP BY
처럼 집계함수를 사용해야합니다. 그렇다고 꼭 SELECT
에 사용된 집계함수를 사용할 필요는 없습니다.
> citykorea 테이블에서 도시별 인구수 합계가 1,000,000명을 초과하는 도시들의 인구수 평균을 출력하시오.
mysql> SELECT district, AVG(population)
-> FROM citykorea
-> GROUP BY district
-> HAVING SUM(population) > 1000000;
+---------------+-----------------+
| district | AVG(population) |
+---------------+-----------------+
| Seoul | 9981619.0000 |
| Pusan | 3804522.0000 |
| Inchon | 2559424.0000 |
| Taegu | 2548568.0000 |
| Taejon | 1425835.0000 |
| Kwangju | 1368341.0000 |
| Kyongsangnam | 308882.2727 |
| Kyonggi | 360531.8333 |
| Chollabuk | 251748.1667 |
| Kyongsangbuk | 206347.7000 |
| Chungchongnam | 170020.0000 |
+---------------+-----------------+
11 rows in set (0.00 sec)
'Database > Mysql' 카테고리의 다른 글
Mysql - Lock 기본 (0) | 2021.08.18 |
---|---|
Mysql - Mysql 성능 최적화 - 1 (시스템 설정) (0) | 2020.11.09 |
Mysql - Mysql(InnoDB)를 사용할때 성능을 위해 알아야하는 것(Index의 중요성) (4) | 2020.09.06 |
Mysql - group by, having, max(count), inner query 예제 (가장 많이 조회된 글의 번호 구하기) (0) | 2019.06.10 |
Mysql - select문 응용 (0) | 2019.04.08 |