2021-01-12 09:27:13

오늘은 group by와 having의 기능에 대해 알아보도록 하겠습니다. 다음은 예제를 위한 테이블입니다. 

 

 

참고로 위 테이블을 만들고 행들을 쌓기 위해서 다음과 같은 쿼리들이 순차적으로 필요했습니다. 제가 만든 예제를 그대로 따라하고 싶은 분은 복사해서 붙여넣어주세요. 

 

CREATE TABLE student (id INT(11) NOT NULL AUTO_INCREMENT, name VARCHAR(10) NOT NULL, grade VARCHAR(10) NOT NULL, PRIMARY KEY(id));

 

INSERT INTO student (name, grade) VALUES ('심교훈', 'C');

INSERT INTO student (name, grade) VALUES ('황병일', 'B');

INSERT INTO student (name, grade) VALUES ('문태호', 'B');

INSERT INTO student (name, grade) VALUES ('정하연', 'C');

INSERT INTO student (name, grade) VALUES ('홍길동', 'A');

INSERT INTO student (name, grade) VALUES ('김개똥', 'D');

INSERT INTO student (name, grade) VALUES ('나나나', 'B');

INSERT INTO student (name, grade) VALUES ('하하하', 'B');

INSERT INTO student (name, grade) VALUES ('내사랑', 'C');

INSERT INTO student (name, grade) VALUES ('김천재', 'D');

INSERT INTO student (name, grade) VALUES ('이바보', 'F');

INSERT INTO student (name, grade) VALUES ('박평범', 'A');

INSERT INTO student (name, grade) VALUES ('로이', 'A');

INSERT INTO student (name, grade) VALUES ('로사', 'D');

INSERT INTO student (name, grade) VALUES ('피카츄', 'B');

INSERT INTO student (name, grade) VALUES ('꼬부기', 'B');

INSERT INTO student (name, grade) VALUES ('파이리', 'B');

INSERT INTO student (name, grade) VALUES ('또가스', 'C');

INSERT INTO student (name, grade) VALUES ('이상해씨', 'A');

INSERT INTO student (name, grade) VALUES ('라이츄', 'F');

 

GROUP BY 사용법

위 student 테이블에서 학점이 A, B, C, D, F인 학생이 각각 몇 명인지 알고 싶다면 group by를 활용하면 됩니다. 

 

SELECT grade, count(*) FROM student GROUP BY grade;

 

 

GROUP BY는 말 그대로 "~을 기준으로 그룹을 지어줘"라는 명령어입니다. 참고로 GROUP BY는 COUNT, MAX, SUM 등의 집계 함수들과 함께 사용됩니다. 본 예제의 경우에는 COUNT 함수가 사용되었습니다. 

 

HAVING 사용법

GROUP BY로 그룹화 한 결과에서 어떤 조건으로 필터링 하고 싶을 때는 HAVING을 사용합니다. 만약 4명 이상의 학생이 받은 학점만 남기고 싶다면 다음과 같이 쿼리문을 수정해주면 됩니다. 

 

SELECT grade, count(*) FROM student GROUP BY grade HAVING count(*) >= 4; 

 

 

관련 글

[MariaDB] 테이블 내 숫자들을 더하려면 SUM 함수  

 

 

(이 글은 2021-5-25에 마지막으로 수정되었습니다)