본문 바로가기
DB/MySQL

GROUP BY와 HAVING

by 가므자 2012. 3. 12.

GROUP BY 절은 동일성을 기초하여 여러개의 행을 그룹화 한다.
예를들면, STUDENT 테이블에서 학년별로 그룹화를 하면 학년별로 모든 행을 그룹화 하는데, 결과는 같은 학년의 학생들의 신상정보를 한 그룹으로 생성하게 된다. 예를 들면, 같은 학년의 학생 중 주야구분이 같은 학생이 얼마나 한 그룹에 속해 있는가? 라는 질의가 있다고 하자. 이 질의에 대한 실제적인 대답은 "먼저 학년별로 그룹화하고, 다시 주야별로 그룹화하여 그룹별로 행의수를 계산한다."

열의 그룹화
GROUP BY 절의 가장 단순한 형식은 오직 하나의 열에 대하여 그룹화하는 것이다.

mysql> select substring(stu_no,1,4)
> from student
> group by substring(stu_no,1,4);


중간 결과
                                                                               
substring(stu_no,1,4)               |      stu_no                                        |   stu_name
2000                                       |     20001001.  20001015,20001021           |   김유신, 박도준, 이상길
2004
2006
2007

→ mysql> select distinct(substring(stu_no,1,4)) 
> from student
출력결과 동일

예제)
등록한 학생에 대하여 학번, 등록횟수, 각 학생이 받은 장학금의 전체 합을 출력하라.
mysql > select stu_no, count(*), sum(jang_total)
> from fee
> group by stu_no;

2개 이상의 열에 대한 그룹화
GROUP BY 절에 2개 이상의 열 명세를 사용할 수 잇다.

예제)
학년별, 주야인원을 파악하라
mysql > select grade, juya, count(*)
> from student
> group by grade, juya
> order by grde, juya;

등록한 학생에 대하여 학번, 이름, 납입금의 총액을 출력하라.
mysql > select s.stu_no,stu_name, sub(fee_pay)
> from student s, fee f
> where s.stu_no = f.stu_no
> group by s.stu_no, stu_name;

수식의 그룹화
예제)
동아리 가입번호를 기초로 하여 학생들을 그룹화하라. 이 때 그룹 1은 가입번호 1부터 3까지이며, 그룹 2는 가입번호 4부터 6까지의 순서로 3명씩을 한 그룹으로 그룹화 한다. 그리고 각 그룹에 대하여 학생의 수와 가장 높은 학번을 출력한다.

mysql > select ceil(cir_num/3), count(*), max(stu_no)
> from circle
> group by ceil(cir_num/3)

NULL 값의 그룹화
NULL 값을 가지고 있는 열을 그룹화한다면 NULL 값은 하난의 그룹으로 구성

예제)
서로 다른 장학코드를 그룹화하고 인원수를 출력하라
mysql > select ifnull(jang_code,null) "장학코드", count(*)
> from fee
> group by jang_code;

GROUP BY와 DISTINCT
SELECT 절이 GROUP BY 절에서 지정한 모든 열을 가지고 있다면 DISTINCT(통계 함수의 외부에 사용될 때)는 필요하지 않다. GROUP BY 절은 중복된 값을 갖지 않도록 행을 그룹화 하기 때문이다.

GROUP BY 절은 FROM 절로부터 생성되는 결과의 행을 그룹화 한다. HAVING 절은 특별한 그룹 속성을 기초로 하여 행의 그룹을 선택할 수 있도록 한다.

HAVING 절
HAVING 절의 조건에 있는 수식은 통계함수를 가질 수 있지만
WHERE 절에 잇는 조건 수식에서는 통계함수를 가질 수 없다.

예제
세 번 이상 등록한 학생의 학번과 등록 횟수를 출력하라.
mysql > select stu_no, count(*)
> from fee
> group by stu_no
> having count(*) > 2;

mysql > select stu_no, sum(fee_pay)
> from fee
> group by stu_no
> having sum(fee_pay) >=5000000;

재학중 납부한 등록금 총액이 가장 많은 학생에 대한 학번과 등록금을 출력
(만약 등록금 총액이 모두 같거나 모두 많다면, 이 질의어는 많은 학생을 반환할것)
mysql > select stu_no, sum(fee_pay)
> from fee
> group by stu_no
> having sum(fee_pay) >=all;
> (select sum(fee_pay)
> from fee
> group by stu_no);

'DB > MySQL' 카테고리의 다른 글

SELECT 명령문의 조합  (0) 2012.03.12
ORDER BY 절  (0) 2012.03.12
통계 함수  (0) 2012.03.12
TEST table 생성  (0) 2012.03.06
MySQL Workbench table editor there are 7 column flags available: PK, NN, UQ, BIN, UN, ZF, AI.  (0) 2012.03.06

댓글