조금씩 꾸준히 완성을 향해

[MySQL] Group By, Having 본문

Database/MySQL

[MySQL] Group By, Having

all_sound 2022. 9. 17. 21:43

GROUP BY (그룹화)

 - 그룹으로 묶어주는 역할을 수행 

   ※ 집계 함수와 함께 사용!

 

 

▶ 사용 가능한 집계 함수

 

  •  AVG() : 평균
  • MIN() : 최소 값
  • MAX() : 최대 값
  • COUNT() : 행의 개수
  • COUNT(DISTINCT 컬럼명) : 행의 개수 (컬럼명 기준 중복 제외)
  • STDEV() : 표준 편차
  • VARIANCE() : 분산

 

▶ 형태

SELECT * FROM 테이블명 GROUP BY 열1, 열2...

 

▶ sample51 확인

mysql> SELECT * FROM sample51;
+------+------+----------+
| no   | name | quantity |
+------+------+----------+
|    1 | A    |        1 |
|    2 | A    |        2 |
|    3 | B    |       10 |
|    4 | C    |        3 |
|    5 | NULL |     NULL |
+------+------+----------+

 

▶ sample51 name열을 그룹바이

mysql> SELECT * FROM sample51 GROUP BY name;
+------+------+----------+
| no   | name | quantity |
+------+------+----------+
|    1 | A    |        1 |
|    3 | B    |       10 |
|    4 | C    |        3 |
|    5 | NULL |     NULL |
+------+------+----------+

 

▶ sample51 name열을 그룹바이 후 no의 최소값, name, quantity 의 합계 표시

mysql> SELECT MIN(no), name, SUM(quantity) FROM sample51 GROUP BY name;
+---------+------+---------------+
| MIN(no) | name | SUM(quantity) |
+---------+------+---------------+
|       1 | A    |             3 |
|       3 | B    |            10 |
|       4 | C    |             3 |
|       5 | NULL |          NULL |
+---------+------+---------------+

 

▶ sample51 name 열을 그룹바이 후 name의 개수가 1인 열의 name 과 COUNT(name) 표시 

    ※ 조건 지정 (HAVING)      

-- where 사용(x) 
mysql> SELECT name, COUNT(name) FROM sample51 WHERE COUNT(name)=1 GROUP BY name; 

-- error
-- query 실행 순서 :from > where > group by > select
--  => select 실행 전에는 count(name)이라는 열이 존재하지 않는다.
-- having 사용 (o)
mysql> SELECT name, COUNT(name) FROM sample51 GROUP BY name HAVING COUNT(name) = 1;
+------+-------------+
| name | COUNT(name) |
+------+-------------+
| B    |           1 |
| C    |           1 |
+------+-------------+
-- 실행 순서 : group by > having

 

▶sample51의 name열을 n, COUNT(name)열을 cn으로 지정

   > cn이 1인 행을 선택하고 n을 그룹바이   >  n, cn열 표시

-- MySQL에서만 예외 : 다른 SQL에서는 error가 뜨는 코드
mysql> SELECT name AS n, COUNT(name) AS cn FROM sample51 GROUP BY n HAVING cn = 1;
+------+----+
| n    | cn |
+------+----+
| B    |  1 |
| C    |  1 |
+------+----+

 

▶ sample51 name열을 그룹바이 후 name, name열의 개수, quantity열의 합계를 quantitiy열의 합계가 높은 순부터 정렬하여 표시 

-- 실행순서 : groupby > order by
mysql> SELECT name, COUNT(name), SUM(quantity) FROM sample51 GROUP BY name ORDER BY SUM(quantity) DESC;
+------+-------------+---------------+
| name | COUNT(name) | SUM(quantity) |
+------+-------------+---------------+
| B    |           1 |            10 |
| A    |           2 |             3 |
| C    |           1 |             3 |
| NULL |           0 |          NULL |
+------+-------------+---------------+