MySQL 예가 포함된 GROUP BY 및 HAVING 절

⚡ 스마트 요약

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

  • 📊 핵심 목적: GROUP BY는 값이 동일한 행들을 그룹화하고 그룹화된 항목별로 하나의 행을 반환합니다.
  • 🧩 단일 컬럼 그라운드ping: Grouping 성별에 따른 구성원 표는 9개 행을 여성용과 남성용 두 행으로 축소합니다.
  • 🔗 다중 열 그룹ping: Grouping 두 열 중 하나라도 값이 다르면 해당 행을 고유한 행으로 간주하므로 정확히 동일한 중복 항목만 병합됩니다.
  • 🧮 집합체 페어링: 개수, 합계, AVGMIN 및 MAX 함수는 그룹별로 하나의 값을 계산하여 요약 보고서를 생성합니다.
  • 🚦 소유 vs. 위치: WHERE는 그룹 이전 행을 필터링합니다.pingHAVING은 그룹을 필터링한 후 결과를 표시하며, HAVING만 집계 결과를 허용합니다.
  • ⚠️ 엄격 모드 주의: ONLY_FULL_GROUP_BY를 사용하는 경우, 선택된 모든 열은 그룹화되거나 집계 함수로 묶여 있어야 합니다.

SQL GROUP BY 및 HAVING 절

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에 속해야 합니다.

자주 묻는 질문

네. GROUP BY 절 자체는 고유 값마다 한 행씩 반환하므로 SELECT DISTINCT 절과 거의 같은 방식으로 중복을 제거합니다. 집계 함수는 각 그룹에 계산된 값이 필요한 경우에만 사용됩니다.

선택한 열이 GROUP BY 절에 포함되지 않았거나 집계 함수로 묶여 있지 않은 경우 오류가 발생합니다. MySQL 해당 열의 어떤 값을 그룹에 표시할지 결정할 수 없으므로 쿼리를 거부합니다.

COUNT(*)는 그룹에 속한 모든 행의 개수를 세고, COUNT(column)은 해당 열이 포함되지 않은 행의 개수만 셉니다. NULL따라서 해당 열에 결측값이 있는 경우 두 수치가 다릅니다.

예. AI 비서 기능은 다음과 같은 도구 안에 내장되어 있습니다. MySQL 워크 벤치 "성별별 회원 수"와 같은 요청을 그룹화된 쿼리로 변환합니다. 그룹을 확인하세요.ping 잘못된 그룹이기 때문에 직접 열을 설정하세요.ping 그럴듯해 보이지만 실제로는 잘못된 합계를 산출합니다.

네, 대개 그렇습니다. AI 쿼리 도우미는 다음과 같은 일반적인 원인을 지적합니다. JOIN 그룹화하기 전에 행을 곱하는 것ping또는 WHERE 대신 HAVING에 필터를 적용하는 방법도 있습니다. 하지만 최종 판단은 여전히 ​​데이터를 가장 잘 아는 사람에게 달려 있습니다.

이 게시물을 요약하면 다음과 같습니다.