이번 시간에는 Group query라고 불리우는 SQL의 Group by, Having절에 대해서 알아보겠습니다.
xxxxxxxxxxmysql> 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
xxxxxxxxxxmysql> 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
xxxxxxxxxxmysql> 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는 집계함수의 결과를 특정 컬럼을 기준으로 묶어 결과를 출력해주는 쿼리입니다.
형식
xxxxxxxxxxSELECT 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만을 초과하는 도시별 인구수 평균을 출력하시오.
xxxxxxxxxxmysql> 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 |