MySQL 예가 포함된 GROUP BY 및 HAVING 절
⚡ 스마트 요약
SQL의 GROUP BY 및 HAVING 절은 상세 데이터를 요약 보고서로 변환합니다. GROUP BY는 동일한 값을 공유하는 행들을 그룹별로 하나의 행으로 통합하는 반면, HAVING은 COUNT와 같은 집계 함수를 적용한 후 해당 그룹들을 필터링합니다.

SQL GROUP BY 절이란 무엇입니까?
GROUP BY 절은 다음 작업에 사용되는 SQL 명령입니다. 동일한 값을 갖는 그룹 행SELECT 문 내부에 작성되며, 일반적으로 집계 함수와 함께 사용하여 데이터베이스에서 요약 보고서를 생성합니다.
그것이 바로 그 기능입니다. 데이터를 요약합니다 데이터베이스에 저장된 항목들입니다. GROUP BY 절을 포함하는 쿼리를 그룹화된 쿼리라고 하며, 그룹화된 각 항목에 대해 하나의 행을 반환합니다.
SQL GROUP BY 구문
이제 해당 절의 목적이 명확해졌으니, 기본적인 그룹화된 쿼리의 구문을 살펴보겠습니다.
SELECT statements... GROUP BY column_name1[, column_name2, ...] [HAVING condition];
여기를 클릭하십시오.
- "SELECT 문…"는 표준입니다 SQL 선택 명령 쿼리.
- "GROUP BY 컬럼_이름1"는 그룹을 수행하는 절입니다.ping column_name1을 기준으로 합니다.
- "[, column_name2, …]”는 선택 사항이며 그룹이 다른 열 이름을 나타낼 때 사용됩니다.ping 두 개 이상의 열에 대해 수행됩니다.
- "[상태를 가지고 있음]"는 선택 사항이며 GROUP BY 절의 영향을 받는 행을 제한하는 데 사용됩니다. 이는 다음과 유사합니다. WHERE 절단, 그룹 형성 후에 적용된다는 점만 다릅니다.ping.
Grouping 단일 열 사용
SQL GROUP BY 절의 효과를 가장 빠르게 확인하는 방법은 그룹화되지 않은 쿼리와 그룹화된 쿼리를 비교하는 것입니다. 멤버 테이블에서 모든 성별 항목을 반환하는 간단한 쿼리부터 시작해 보세요.
SELECT `gender` FROM `members`;
| 성별 |
|---|
| 여성 |
| 여성 |
| 남성 |
| 여성 |
| 남성 |
| 남성 |
| 남성 |
| 남성 |
| 남성 |
9개의 행이 반환되며 모든 값이 중복됩니다. 성별에 대한 고유한 값만 원한다고 가정해 보겠습니다. 아래 쿼리는 GROUP BY 절을 추가합니다.
SELECT `gender` FROM `members` GROUP BY `gender`;
위 스크립트를 실행하면 MySQL 워크 벤치 myflixdb에 대해 다음과 같은 결과를 얻었습니다.
| 성별 |
|---|
| 여성 |
| 남성 |
참고로, 테이블에는 두 가지 성별 유형만 있으므로 두 행만 반환됩니다. GROUP BY 절은 "남성" 구성원을 모두 함께 그룹화하여 단일 행을 반환했고, "여성" 구성원에 대해서도 동일하게 처리했습니다.
Grouping 여러 열 사용
Grouping 단일 열에 대한 비교는 실제 보고서에는 너무 조잡한 경우가 많습니다. GROUP BY 절은 쉼표로 구분된 열 목록을 허용하며, 각 열 값의 조합이 그룹을 정의합니다.
영화 카테고리 ID와 해당 영화가 개봉된 연도 목록을 얻고 싶다고 가정해 보겠습니다. 먼저 이 간단한 쿼리의 출력 결과를 살펴보세요.
SELECT `category_id`, `year_released` FROM `movies`;
| 카테고리_ID | 연도_출시 |
|---|---|
| 1 | 2011 |
| 2 | 2008 |
| NULL | 2008 |
| NULL | 2010 |
| 8 | 2007 |
| 6 | 2007 |
| 6 | 2007 |
| 8 | 2005 |
| NULL | 2012 |
| 7 | 1920 |
| 8 | NULL |
| 8 | 1920 |
강조 표시된 행은 결과에 중복된 항목이 포함되어 있음을 보여줍니다. GROUP BY 절을 사용하여 동일한 쿼리를 실행하면 중복 항목이 제거됩니다.
SELECT `category_id`, `year_released` FROM `movies` GROUP BY `category_id`, `year_released`;
위 스크립트를 실행하면 MySQL Workbench를 사용하여 myflixdb를 테스트한 결과는 아래와 같습니다.
| 카테고리_ID | 연도_출시 |
|---|---|
| NULL | 2008 |
| NULL | 2010 |
| NULL | 2012 |
| 1 | 2011 |
| 2 | 2008 |
| 6 | 2007 |
| 7 | 1920 |
| 8 | 1920 |
| 8 | 2005 |
| 8 | 2007 |
GROUP BY 절은 category_id와 year_released 모두를 기준으로 작동합니다. 유일한 행. 2007년 카테고리 6에 대한 중복 행 두 개가 하나로 통합되었습니다.
경험 법칙 : 카테고리 ID는 같지만 출시 연도가 다른 경우, 해당 행은 고유한 것으로 간주됩니다. 카테고리 ID와 출시 연도가 같은 행이 두 개 이상인 경우, 해당 행들은 중복된 것으로 간주되어 하나만 표시됩니다.
Grouping 및 집계 함수
중복 제거는 유용하지만, 그룹의 진정한 힘은 여기에 있습니다.ping ~와 짝을 이룰 때 나타납니다 집계 함수집계 함수는 각 그룹에 대해 하나의 값을 계산합니다. COUNT는 행 수를 세고, SUM은 값을 더합니다. AVGMIN, MAX는 분산 정도를 나타냅니다.
데이터베이스에 있는 남성 회원과 여성 회원의 총 수를 알고 싶다고 가정해 보겠습니다. 아래 스크립트는 이를 수행합니다.
SELECT `gender`, COUNT(`membership_number`) FROM `members` GROUP BY `gender`;
위 스크립트를 실행하면 MySQL Workbench를 사용하여 myflixdb를 테스트한 결과는 다음과 같습니다.
| 성별 | COUNT(`회원번호`) |
|---|---|
| 여성 | 3 |
| 남성 | 6 |
각 행은 고유한 성별 값별로 그룹화되며, 각 그룹 내 행 수는 COUNT 집계 함수를 사용하여 계산됩니다. 9개의 회원 기록은 두 개의 요약 행으로 축소됩니다.
HAVING 절을 사용하여 쿼리 결과 제한하기
Grouping모든 행에 대해 조건을 만족하는 결과가 항상 필요한 것은 아닙니다. 때로는 특정 기준에 부합하는 결과만 표시해야 할 때가 있는데, 이때 HAVING 절을 사용합니다.
영화 카테고리 ID가 8인 모든 영화의 개봉 연도를 알고 싶다고 가정해 보겠습니다. 아래 스크립트는 그 결과를 얻습니다.
SELECT * FROM `movies` GROUP BY `category_id`, `year_released` HAVING `category_id` = 8;
위 스크립트를 실행하면 MySQL Workbench를 사용하여 myflixdb를 테스트한 결과는 아래와 같습니다.
| 영화_ID | 제목 | 이사 | 연도_출시 | 카테고리_ID |
|---|---|---|---|---|
| 9 | Honey moon | 존 슐츠 | 2005 | 8 |
| 5 | 아빠의 어린 소녀들 | NULL | 2007 | 8 |
'보유' 조건에 따라 카테고리 ID가 8인 영화만 유지되었습니다.
경고: MySQL 5.7 버전 이상에서는 기본적으로 ONLY_FULL_GROUP_BY 모드가 활성화되어 있으며, 이 모드에서는 GROUP BY 절이 포함된 SELECT * 쿼리가 거부됩니다. movie_id, title, director 열이 그룹화되거나 집계되지 않기 때문입니다. 실제 운영 환경에서는 그룹화할 열의 이름을 명시적으로 지정해야 합니다. 예를 들어, SELECT category_id, year_released FROM movies GROUP BY category_id, year_released HAVING category_id = 8;
WHERE vs HAVING vs GROUP BY vs ORDER BY
초보자들은 이 네 가지 절을 자주 혼용하는데, 그 이유는 이 네 가지 절 모두 결과 집합을 형성하기 때문입니다. 차이점은 다음과 같습니다. 언제 MySQL 다음과 같이 적용됩니다. WHERE 절은 행이 그룹화되기 전에 실행되고, HAVING 절은 후에 실행되며, ORDER BY 절은 마지막에 실행됩니다.
| 절 | 그것이하는 일 | 실행될 때 | 집계 함수를 허용합니다. |
|---|---|---|---|
| Neocity | 그룹화하기 전에 개별 행을 필터링합니다.ping. | 그룹화하기 전 | 아니 |
| GROUP BY | 동일한 값을 공유하는 행들을 그룹별로 하나의 행으로 통합합니다. | 어디 이후에 | 적용 할 수 없음 |
| 지키는 | GROUP BY로 생성된 그룹을 필터링합니다. | 그룹화 후 | 예, 예를 들어 COUNT(*) > 2인 경우 |
| 주문 | 이전 절을 통과한 행들을 정렬합니다. | 성 | 네, 집계 별칭도 정렬할 수 있습니다. |
실질적인 결과는 성능 저하로 이어집니다. WHERE 절을 사용한 필터링은 그룹 이전의 행들을 제거합니다.ping 작업이 시작되므로, 집계 결과에 의존하지 않는 조건은 HAVING이 아닌 WHERE에 속해야 합니다.
