일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- googleapiclient
- Seq2Seq
- 정렬
- 파이썬
- Python
- db
- programmers
- PANDAS
- gan
- kmu
- 국민대
- python3
- 머신 러닝
- LSTM
- 데이터베이스
- C++
- Heap
- Stack
- instaloader
- Regression
- OS
- machine learning
- 스택
- 회귀
- 프로그래머스
- SQL
- 국민대학교
- GIT
- 운영체제
- 재귀
Archives
- Today
- Total
정리 노트
GROUP BY, HAVING 절 본문
728x90
DML 문을 연습할 데이터 베이스는 아래의 사이트에서 스크립트를 다운로드하여 실행해 생성했습니다.
GROUP BY절과 HAVING 절은 다음과 같은 특성들을 가지고 있습니다.
- GROUP BY 절로 소그룹별 기준을 정하고 SELECT 절에 집계 함수를 사용
- 집계 함수의 통계는 NULL 값을 가진 행을 제외하고 수행
- 집계 함수는 WHERE 절에는 올 수 없음
- SELECT 절과 달리 ALIAS를 쓸 수 없음 (SELECT ~ AS ~ 와 같이 AS를 사용할 수 없음)
- GROUP BY 절에 의해 그룹화된 데이터 중, HAVING 절에서 제한을 두어 조건을 만족하는 결과만 출력
GROUP BY 절
WHERE 절을 통한 1차 가공 정보 외에도, GROUP BY 절을 통해 2차 가공 정보가 필요할 때도 있습니다. 예를 들어 각 축구 팀별로 선수 인원수, 평균 체중 등의 정보를 얻을 수 있습니다.
여기서는 customers 테이블에서 country별 creditLimit의 평균을 계산하는 예시로 SQL을 작성하겠습니다.
SELECT country, AVG(creditLimit) FROM customers;
위와 같이 적으면 아래와 같은 에러 메시지를 얻게 됩니다. 그룹화를 진행하지 않고 그룹별 집계 함수를 적용하려는 결과를 얻으려 했기 때문에 에러가 생깁니다.
Error Code: 1140. In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'classicmodels.customers.country'; this is incompatible with sql_mode=only_full_group_by
이 에러를 없애기 위해 country 열을 지우면 테이블에서의 전체 평균을 계산하게 되므로 목적에 맞지 않는 결과를 가지게 됩니다. 따라서 목표한 결과를 얻기 위해서 GROUP BY 절을 사용합니다.
SELECT country, ROUND(AVG(creditLimit), 2) AS CreditLimit FROM customers GROUP BY country
ORDER BY CreditLimit DESC LIMIT 5;
HAVING 절
HAVING 절을 통해 그룹별 집계 결과에 조건을 걸어서 원하는 결과만 출력하게 할 수 있습니다.
예를 들어 country별 creditLimit 평균값들 중 90000 이하인 값들만 출력하기 위해 SQL을 작성하겠습니다.
SELECT country, ROUND(AVG(creditLimit), 2) AS CreditLimit FROM customers
WHERE ROUND(AVG(creditLimit), 2) <= 90000 GROUP BY country ORDER BY CreditLimit DESC LIMIT 5;
위와 같이 작성하면 아래와 같은 에러를 얻게 됩니다. WHERE 절에 집계 함수를 사용하여 결과를 걸러내려 했기 때문에 에러가 생깁니다.
Error Code: 1111. Invalid use of group function
원하는 결과를 얻기 위해서는 WHERE 절에 작성했던 조건문을 HAVING 절로 옮겨 적어야 합니다.
SELECT country, ROUND(AVG(creditLimit), 2) AS CreditLimit FROM customers
GROUP BY country HAVING ROUND(AVG(creditLimit), 2) <= 90000 ORDER BY CreditLimit DESC LIMIT 5;
728x90
'개념 정리 > 데이터베이스' 카테고리의 다른 글
ORDER BY 절 (0) | 2024.07.02 |
---|---|
집계 함수 (0) | 2024.06.25 |
SQL 단일 행 내장 함수들 (0) | 2024.04.18 |
SELECT문 WHERE절 (4) | 2024.02.28 |
SELECT문 (2) | 2024.02.08 |